Converter uma string JSON em objeto em Java ME?

116

Existe uma maneira em Java / J2ME de converter uma string, como:

{name:"MyNode", width:200, height:100}

a uma representação interna do objeto do mesmo, em uma linha de código?

Porque o método atual é muito tedioso:

Object n = create("new");
setString(p, "name", "MyNode");
setInteger(p, "width", 200);
setInteger(p, "height", 100);

Talvez uma biblioteca JSON?

O Flash
fonte
6
Sua string não é realmente um objeto Json, consulte o padrão Json ... É mais como uma notação JavaScript.
PhiLho
19
@Jeremy Rudd: Deveria ser{"name":"MyNode", "width":200, "height":100}
Esteban Küber,
1
@voyager: Eu sei, mas o JavaScript oferece suporte nativo a nomes de propriedades sem aspas.
TheFlash
1
@PhiLho: Eu sei disso, mas mantive assim por uma questão de clareza. O realce de sintaxe do SO teria bagunçado tudo. Nome e valor em vermelho.
TheFlash
Existe uma maneira de fazer a conversão usando as APIs principais do Java? Talvez em Java 8? Java 9?
AlikElzin-kilaka de

Respostas:

108

Usei alguns deles e o meu favorito é,

http://code.google.com/p/json-simple/

A biblioteca é muito pequena, por isso é perfeita para J2ME.

Você pode analisar JSON no objeto Java em uma linha como esta,

JSONObject json = (JSONObject)new JSONParser().parse("{\"name\":\"MyNode\", \"width\":200, \"height\":100}");
System.out.println("name=" + json.get("name"));
System.out.println("width=" + json.get("width"));
ZZ Coder
fonte
1
Posso usar esta biblioteca em um miniaplicativo. Se ele usar o Reflection, terei de enfrentar um erro de permissão de reflexão. Isso funcionaria?
Mridang Agarwalla
O jsonSimple ainda tem a classe JSONParser? Não posso ligar para a classe.
phuwin
JSONParser agora está obsoleto.
Varda Elentári
79

A opção mais simples é Jackson :

MyObject ob = new ObjectMapper().readValue(jsonString, MyObject.class);

Existem outras bibliotecas igualmente simples de usar (Gson já foi mencionado); mas algumas opções são mais trabalhosas, como a biblioteca org.json original, que requer a criação de um "JSONObject" intermediário, mesmo se você não precisar deles.

StaxMan
fonte
Jackson não suporta J2ME
skue
Verdade, se j2me ainda estiver aproximadamente no nível JDK 1.4 (Jackson requer 1.5)
StaxMan de
1
Você só tem 2 upticks, mas merece mais. Jackson foi realmente fácil de conectar em nosso aplicativo. Obrigado por recomendar.
Dan Doyon
1
Jackson também pode desserializar para um objeto simples. por exemplo. Object obj = new ObjectMapper().readValue("[1, 2, 3]", Object.class);
neoneye
Mais exemplos de código usando Jackson: mkyong.com/java/how-to-convert-java-object-to-from-json-jackson
cellepo
61

GSON é uma boa opção para converter objeto java em objeto json e vice-versa.
É uma ferramenta fornecida pelo google.

para converter json para uso de objeto java: fromJson(jsonObject,javaclassname.class)
para converter objeto java para uso de objeto json: toJson(javaObject)
e o resto será feito automaticamente

Para mais informações e para download

Alok Vaish
fonte
1
1 Eu estava procurando algo semelhante e isso se encaixa perfeitamente!
Roy Tang
23

Você pode fazer isso facilmente com o Google GSON.

Digamos que você tenha uma classe chamada User com os campos user, width e height e deseja converter a seguinte string json no objeto User.

{"name":"MyNode", "width":200, "height":100}

Você pode fazer isso facilmente, sem ter que lançar (mantendo o comentário de nimcap em mente;)), com o seguinte código:

Gson gson = new Gson(); 
final User user = gson.fromJson(jsonString, User.class);

Onde jsonString é a String JSON acima.

Para obter mais informações, consulte https://code.google.com/p/google-gson/

Sufinawaz
fonte
3
E sim, sei que a pergunta foi feita há 4 anos, mas minha resposta é para as partes interessadas que precisam fazer isso no momento :) Espero que ajude alguém!
sufinawaz
22

Você tem muitos analisadores JSON para Java :

  • JSONObject.java
    Um JSONObject é uma coleção não ordenada de pares nome / valor. Sua forma externa é uma string envolta em chaves com dois pontos entre os nomes e valores e vírgulas entre os valores e nomes. A forma interna é um objeto que possui os métodos get () e opt () para acessar os valores por nome e métodos put () para adicionar ou substituir valores por nome. Os valores podem ser qualquer um destes tipos: Boolean, JSONArray, JSONObject, Number e String ou o objeto JSONObject.NULL.

  • JSONArray.java
    Um JSONArray é uma sequência ordenada de valores. Sua forma externa é uma string envolvida em colchetes com vírgulas entre os valores. A forma interna é um objeto que possui os métodos get () e opt () para acessar os valores por índice e os métodos put () para adicionar ou substituir valores. Os valores podem ser qualquer um destes tipos: Boolean, JSONArray, JSONObject, Number e String ou o objeto JSONObject.NULL.

  • JSONStringer.java
    Um JSONStringer é uma ferramenta para produzir texto JSON rapidamente.

  • JSONWriter.java
    Um JSONWriter é uma ferramenta para escrever texto JSON rapidamente em fluxos.

  • JSONTokener.java
    Um JSONTokener pega uma string de origem e extrai caracteres e tokens dela. Ele é usado pelos construtores JSONObject e JSONArray para analisar strings de origem JSON.

  • JSONException.java
    Uma JSONException é lançada quando uma sintaxe ou erro de procedimento é detectado.

  • JSONString.java
    O JSONString é uma interface que permite que as classes implementem sua serialização JSON.

Esteban Küber
fonte
1
Se J2ME tiver java.io.IOException; java.io.Writer; java.lang.reflect.Field; java.lang.reflect.Modifier; java.lang.reflect.Method; java.util.Collection; java.util.HashMap; java.util.Iterator; java.util.Map; java.util.TreeSet ;, então você poderia usar o primeiro, pois são javaclasses simples .
Esteban Küber,
2
Acho que não há pacote java.lang.reflect no MIDP 2.0. Será difícil fazer um analisador genérico ...
PhiLho
2
Cara esperto, Voyager, você acabou de copiar na documentação das classes JSON Java padrão.
TheFlash
@Jeremy Rudd: claro que sim, como você achou que fiz isso tão rápido? Não foi uma tentativa de trollar você, sua prática padrão para vincular e copiar. Sinto muito se saiu dessa maneira.
Esteban Küber,
10
Eu votei contra isso porque não responde à pergunta. É dar uma lista de classes relacionadas, mas nenhuma delas realmente realiza o que o solicitante deseja.
Jeff Martin
7

O site oficial JSON é onde você deve olhar. Ele fornece várias bibliotecas que podem ser usadas com Java, eu pessoalmente usei esta, JSON-lib, que é uma implementação do trabalho no site, por isso tem exatamente a mesma classe - métodos, etc. nesta página .

Se você clicar nos links html, poderá encontrar o que quiser.

Em resumo:

para criar um objeto json e uma matriz json, o código é:

JSONObject obj = new JSONObject();
obj.put("variable1", o1);
obj.put("variable2", o2);
JSONArray array = new JSONArray();
array.put(obj);

o1, o2 podem ser tipos primitivos (long, int, boolean), Strings ou Arrays.

O processo reverso é bastante simples, quero dizer, converter uma string em objeto / array json.

String myString;

JSONObject obj = new JSONObject(myString);

JSONArray array = new JSONArray(myString);

Para ser analisado corretamente, você só precisa saber se está analisando um array ou um objeto.

tzik
fonte
5

Como muitos já disseram, uma maneira bem simples de fazer isso usando JSON.simple como abaixo

import org.json.JSONObject;

String someJsonString = "{name:"MyNode", width:200, height:100}";
JSONObject jsonObj = new JSONObject(someJsonString);

Em seguida, use jsonObj para lidar com o objeto JSON. por exemplo, jsonObj.get ("nome");

Conforme o link abaixo, JSON.simple está mostrando eficiência constante para arquivos JSON pequenos e grandes

http://blog.takipi.com/the-ultimate-json-library-json-simple-vs-gson-vs-jackson-vs-json/

Kripz
fonte
Você escreveu que muitos já declararam a sugestão que você postou. Qual é a essência da sua resposta?
Dakab
1
@dakab Obrigado por seus comentários. A essência dessa questão era fornecer uma linha de código que atendesse ao objetivo. E como há muitas apis disponíveis para fazer isso, gostaria apenas de fornecer algumas informações adicionais sobre a comparação da eficiência das apis. Portanto, a essência da resposta que eu quis dizer foi dar ao código + algumas informações sobre a comparação das eficiências das diferentes apis mencionadas por outros colegas neste tópico.
Kripz
3

JSON IO é de longe a maneira mais fácil de converter uma string JSON ou fluxo de entrada JSON em um objeto Java

String para objeto Java
Object obj = JsonReader.jsonToJava("[\"Hello, World\"]");

https://code.google.com/p/json-io/

Josue Alexander Ibarra
fonte
3

Esta é uma pergunta antiga e json-simple ( https://code.google.com/p/json-simple/ ) poderia ser uma boa solução naquele momento, mas considere que o projeto parece não estar ativo por um tempo!

Sugiro o Gson que agora está hospedado em: https://github.com/google/gson

Se o seu problema é desempenho, você pode dar uma olhada em alguns benchmarks http://blog.takipi.com/the-ultimate-json-library-json-simple-vs-gson-vs-jackson-vs-json/ que se comparam.

Alireza Fattahi
fonte
2

Eu escrevi uma biblioteca que usa json.org para analisar JSON, mas na verdade criará um proxy de uma interface para você. O código / JAR está em code.google.com.

http://fixjures.googlecode.com/

Não sei se funciona no J2ME. Como ele usa o Java Reflection para criar proxies, estou pensando que não funcionará. Além disso, ele atualmente tem uma forte dependência das Coleções do Google que desejo remover e provavelmente é muito pesado para suas necessidades, mas permite que você interaja com seus dados JSON da maneira que está procurando:

interface Foo {
    String getName();
    int getWidth();
    int getHeight();
}

Foo myFoo = Fixjure.of(Foo.class).from(JSONSource.newJsonString("{ name : \"foo name\" }")).create();
String name = myFoo.getName(); // name now .equals("foo name");
Steve Reed
fonte
Incrível, embora eu não queira Foo, apenas o Objeto nativo.
TheFlash
2

Basta fazer um objeto Json em java com a seguinte string Json. No seu caso

{name:"MyNode", width:200, height:100}

se o acima for sua string Json, apenas crie um objeto Json com ela.

JsonString ="{name:"MyNode", width:200, height:100}";
JSONObject yourJsonObject = new JSONObject(JsonString);
System.out.println("name=" + yourJsonObject.getString("name"));
System.out.println("width=" + yourJsonObject.getString("width"));
RAM
fonte
2

Jackson para arquivos grandes, GSON para arquivos pequenos e JSON.simple para lidar com ambos.

Thanga
fonte
1
evidência para apoiar o comentário de @ thanga aqui blog.takipi.com/…
Gob00st
Eu também já vi isso, mas considere também que arquivos pequenos são fáceis de analisar de qualquer maneira. Eu só pensaria em JSON.simple se você tiver uma tonelada de pequenos arquivos para analisar onde essa diferença de 30% ou mais sobre Jackson vai somar. Veja também os principais comentários, esse benchmark pode não ser muito confiável. Realmente, se a velocidade é tão importante para você, você provavelmente deve projetar para que possa injetar um analisador para alterar implementações facilmente e fazer seus próprios testes de benchmark.
Usuário de