Convertire una stringa JSON in oggetto in Java ME?


116

C'è un modo in Java / J2ME per convertire una stringa, come ad esempio:

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

ad una rappresentazione Object interna dello stesso, in una riga di codice?

Perché il metodo attuale è troppo noioso:

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

Forse una libreria JSON?


6
La tua stringa non è realmente un oggetto Json, vedi lo standard Json ... È più simile alla notazione JavaScript.
PhiLho

19
@Jeremy Rudd: Dovrebbe essere{"name":"MyNode", "width":200, "height":100}
Esteban Küber,

1
@voyager: lo so, ma JavaScript supporta nativamente i nomi delle proprietà senza virgolette.
TheFlash

1
@PhiLho: lo so, ma l'ho mantenuto così per motivi di chiarezza. L'evidenziatore della sintassi SO avrebbe rovinato tutto. Nome e valore in rosso.
TheFlash

C'è un modo per eseguire la conversione utilizzando le API principali di Java? Forse in Java 8? Java 9?
AlikElzin-kilaka

Risposte:


108

Ne ho usati alcuni e il mio preferito è,

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

La libreria è molto piccola quindi è perfetta per J2ME.

Puoi analizzare JSON in un oggetto Java in una riga come questa,

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"));

1
Posso usare questa libreria in un'applet. Se utilizza la riflessione, dovrò affrontare un errore di autorizzazione alla riflessione. Funzionerebbe?
Mridang Agarwalla

JsonSimple ha ancora la classe JSONParser? Non posso chiamare la classe.
phuwin

JSONParser è ora deprecato.
Varda Elentári

79

L'opzione più semplice è Jackson :

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

Ci sono altre librerie altrettanto semplici da usare (Gson è già stato menzionato); ma alcune scelte sono più laboriose, come la libreria org.json originale, che richiede di creare "JSONObject" intermedio anche se non ne hai bisogno.


Jackson non supporta J2ME
skue

Vero, se j2me è ancora approssimativamente al livello di JDK 1.4 (Jackson richiede 1.5)
StaxMan

1
Hai solo 2 aumenti ma meriti di più. È stato davvero facile collegare Jackson alla nostra app. Grazie per aver consigliato.
Dan Doyon

1
Jackson può anche deserializzare su un oggetto semplice. per esempio. Object obj = new ObjectMapper().readValue("[1, 2, 3]", Object.class);
neoneye


61

GSON è una buona opzione per convertire un oggetto java in un oggetto json e viceversa.
È uno strumento fornito da Google.

per convertire json in un oggetto java usa: fromJson(jsonObject,javaclassname.class)
per convertire un oggetto java in un oggetto json usa: toJson(javaObject)
e il resto verrà eseguito automaticamente

Per ulteriori informazioni e per il download


1
+1 Stavo cercando qualcosa di simile e questo si adatta perfettamente al conto!
Roy Tang

23

Puoi farlo facilmente con Google GSON.

Supponiamo che tu abbia una classe chiamata Utente con i campi utente, larghezza e altezza e desideri convertire la seguente stringa json nell'oggetto Utente.

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

Puoi farlo facilmente, senza dover eseguire il cast (tenendo presente il commento di nimcap;)), con il seguente codice:

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

Dove jsonString è la stringa JSON precedente.

Per ulteriori informazioni, consulta https://code.google.com/p/google-gson/


3
E sì, mi rendo conto che la domanda è stata posta 4 anni fa, ma la mia risposta è per le parti interessate che hanno bisogno di farlo al momento :) Spero che aiuti qualcuno!
sufinawaz

22

Hai molti parser JSON per Java :

  • JSONObject.java
    Un JSONObject è una raccolta non ordinata di coppie nome / valore. La sua forma esterna è una stringa racchiusa tra parentesi graffe con due punti tra i nomi e i valori e virgole tra i valori e i nomi. Il form interno è un oggetto che ha metodi get () e opt () per accedere ai valori per nome e metodi put () per aggiungere o sostituire valori per nome. I valori possono essere uno di questi tipi: Boolean, JSONArray, JSONObject, Number e String o l'oggetto JSONObject.NULL.

  • JSONArray.java
    Un JSONArray è una sequenza ordinata di valori. La sua forma esterna è una stringa racchiusa tra parentesi quadre con virgole tra i valori. Il form interno è un oggetto con metodi get () e opt () per accedere ai valori tramite indice e metodi put () per aggiungere o sostituire valori. I valori possono essere uno di questi tipi: Boolean, JSONArray, JSONObject, Number e String o l'oggetto JSONObject.NULL.

  • JSONStringer.java
    Un JSONStringer è uno strumento per produrre rapidamente testo JSON.

  • JSONWriter.java
    Un JSONWriter è uno strumento per scrivere rapidamente testo JSON negli stream.

  • JSONTokener.java
    Un JSONTokener prende una stringa sorgente e ne estrae caratteri e token. Viene utilizzato dai costruttori JSONObject e JSONArray per analizzare le stringhe di origine JSON.

  • JSONException.java
    Viene generata una JSONException quando viene rilevato un errore di sintassi o procedurale.

  • JSONString.java
    JSONString è un'interfaccia che consente alle classi di implementare la loro serializzazione JSON.


1
Se J2ME ha 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 ;, allora potresti usare il primo, poiché sono javaclassi semplici .
Esteban Küber

2
Penso che non ci sia alcun pacchetto java.lang.reflect in MIDP 2.0. Sarà difficile fare un parser generico ...
PhiLho

2
Ragazzo intelligente, viaggiatore, hai appena copiato nella documentazione delle classi JSON standard di Java.
TheFlash

@ Jeremy Rudd: certo che l'ho fatto, come hai pensato che l'avessi fatto così in fretta? Non è stato un tentativo di trollarti, era pratica standard sia collegare che copiare. Mi dispiace se è uscito in quel modo.
Esteban Küber

10
Ho downvotato questo perché non risponde alla domanda. Fornisce un elenco di classi correlate, ma nessuna di esse realizza effettivamente ciò che il richiedente desidera.
Jeff Martin,

7

Il sito ufficiale JSON è dove dovresti guardare. Fornisce varie librerie che possono essere utilizzate con Java, ho usato personalmente questa, JSON-lib che è un'implementazione del lavoro nel sito, quindi ha esattamente la stessa classe - metodi ecc. In questa pagina .

Se fai clic sui link html lì puoi trovare tutto ciò che desideri.

In breve:

per creare un oggetto json e un array json, il codice è:

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

o1, o2 possono essere tipi primitivi (long, int, boolean), stringhe o array.

Il processo inverso è abbastanza semplice, intendo convertire una stringa in oggetto / array json.

String myString;

JSONObject obj = new JSONObject(myString);

JSONArray array = new JSONArray(myString);

Per essere analizzato correttamente devi solo sapere se stai analizzando un array o un oggetto.



5

Come molti hanno già affermato, un modo piuttosto semplice per farlo utilizzando JSON.simple come di seguito

import org.json.JSONObject;

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

Quindi usa jsonObj per gestire l'oggetto JSON. es. jsonObj.get ("nome");

Come per il collegamento seguente, JSON.simple mostra un'efficienza costante per file JSON sia piccoli che grandi

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


Hai scritto che molti hanno già dichiarato il suggerimento che hai pubblicato. Qual è l'essenza della tua risposta?
dakab

1
@dakab Grazie per i tuoi commenti. L'essenza di questa domanda era fornire una riga di codice che servisse allo scopo. E poiché ci sono molte API disponibili per farlo, volevo solo fornire alcune informazioni aggiuntive sul confronto anche dell'efficienza delle API. Quindi l'essenza di questa risposta che intendevo era dare al codice + alcune informazioni sul confronto delle efficienze delle diverse API menzionate da altri compagni in questo thread.
Kripz


3

Questa è una vecchia domanda e json-simple ( https://code.google.com/p/json-simple/ ) potrebbe essere una buona soluzione in quel momento, ma tieni presente che il progetto sembra non essere attivo per un po '!

Suggerisco il Gson che ora è ospitato su: https://github.com/google/gson

Se le prestazioni sono il tuo problema, puoi dare un'occhiata ad alcuni benchmark http://blog.takipi.com/the-ultimate-json-library-json-simple-vs-gson-vs-jackson-vs-json/ che confrontano.



2

Ho scritto una libreria che utilizza json.org per analizzare JSON, ma in realtà creerà un proxy di un'interfaccia per te. Il codice / JAR si trova su code.google.com.

http://fixjures.googlecode.com/

Non so se funziona su J2ME. Dato che utilizza Java Reflection per creare proxy, penso che non funzionerà. Inoltre, attualmente ha una forte dipendenza dalle raccolte di Google che desidero rimuovere ed è probabilmente troppo pesante per le tue esigenze, ma ti consente di interagire con i tuoi dati JSON nel modo che stai cercando:

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");

Incredibile, anche se non voglio Foo, solo l'oggetto nativo.
TheFlash

2

Basta creare un oggetto Json in java con la seguente stringa Json, nel tuo caso

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

se quanto sopra è la tua stringa Json, crea semplicemente un oggetto Json con esso.

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"));

2

Jackson per file grandi, GSON per file piccoli e JSON.simple per la gestione di entrambi.


1
prove a sostegno del commento di @ thanga da qui blog.takipi.com/…
Gob00st

L'ho già visto prima, ma considero anche che i file piccoli sono comunque veloci da analizzare. Penserei a JSON.simple solo se hai una TONNELLATA di piccoli file da analizzare dove si sommerà quel 30% circa di differenza su Jackson. Vedi anche i commenti principali lì, quel benchmark potrebbe non essere troppo affidabile. In realtà, se la velocità è così importante per te, dovresti probabilmente progettare in modo da poter iniettare un parser per modificare facilmente le implementazioni e fare i tuoi test di benchmark.
Utente
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.