Konvertieren Sie eine JSON-Zeichenfolge in ein Objekt in Java ME?


116

Gibt es in Java / J2ME eine Möglichkeit, eine Zeichenfolge zu konvertieren, z.

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

zu einer internen Objektdarstellung derselben in einer Codezeile?

Weil die derzeitige Methode zu langwierig ist:

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

Vielleicht eine JSON-Bibliothek?


6
Ihre Zeichenfolge ist nicht wirklich ein Json-Objekt, siehe Json-Standard ... Sie ähnelt eher der JavaScript-Notation.
PhiLho

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

1
@voyager: Ich weiß, aber JavaScript unterstützt nativ Eigenschaftsnamen ohne Anführungszeichen.
TheFlash

1
@PhiLho: Ich weiß das, aber ich habe es aus Gründen der Klarheit so gehalten. Der SO-Syntax-Textmarker hätte es vermasselt. Name und Wert in rot.
TheFlash

Gibt es eine Möglichkeit, die Konvertierung mithilfe der Java-Kern-APIs durchzuführen? Vielleicht in Java 8? Java 9?
AlikElzin-Kilaka

Antworten:


108

Ich habe einige davon benutzt und mein Favorit ist:

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

Die Bibliothek ist sehr klein und daher perfekt für J2ME.

Sie können JSON in einer Zeile wie folgt in ein Java-Objekt analysieren:

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
Kann ich diese Bibliothek in einem Applet verwenden? Wenn Reflection verwendet wird, tritt ein Reflectionpermission-Fehler auf. Würde es funktionieren?
Mridang Agarwalla

Hat jsonSimple noch die JSONParser-Klasse? Ich kann die Klasse nicht anrufen.
Phuwin

JSONParser ist jetzt veraltet.
Varda Elentári

79

Die einfachste Option ist Jackson :

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

Es gibt andere ähnlich einfach zu verwendende Bibliotheken (Gson wurde bereits erwähnt); Einige Auswahlmöglichkeiten sind jedoch aufwändiger, z. B. die ursprüngliche org.json-Bibliothek, für die Sie ein Zwischenprodukt "JSONObject" erstellen müssen, auch wenn Sie diese nicht benötigen.


Jackson unterstützt J2ME
Skue

Stimmt, wenn j2me noch ungefähr auf JDK 1.4-Niveau ist (Jackson benötigt 1.5)
StaxMan

1
Sie haben nur 2 Upticks, verdienen aber mehr. Jackson war wirklich einfach in unsere App einzubinden. Vielen Dank für die Empfehlung.
Dan Doyon

1
Jackson kann auch zu einem einfachen Objekt deserialisieren. z.B. Object obj = new ObjectMapper().readValue("[1, 2, 3]", Object.class);
Neoneye


61

GSON ist eine gute Option, um Java-Objekte in JSON-Objekte zu konvertieren und umgekehrt.
Es ist ein Tool von Google.

zum Konvertieren von json in Java-Objektverwendung: fromJson(jsonObject,javaclassname.class)
zum Konvertieren von Java-Objekt in json-Objektverwendung: toJson(javaObject)
und der Rest wird automatisch ausgeführt

Für weitere Informationen und zum Download


1
+1 Ich habe nach etwas Ähnlichem gesucht und das passt perfekt zur Rechnung!
Roy Tang

23

Sie können dies problemlos mit Google GSON tun.

Angenommen, Sie haben eine Klasse namens Benutzer mit den Feldern Benutzer, Breite und Höhe und möchten die folgende JSON-Zeichenfolge in das Benutzerobjekt konvertieren.

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

Mit dem folgenden Code können Sie dies problemlos tun, ohne einen Cast ausführen zu müssen (unter Berücksichtigung des Kommentars von nimcap;)):

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

Wobei jsonString der obige JSON-String ist.

Weitere Informationen finden Sie unter https://code.google.com/p/google-gson/.


3
Und ja, mir ist klar, dass die Frage vor 4 Jahren gestellt wurde, aber meine Antwort ist für die Interessenten, die dies derzeit tun müssen :) Hoffe, es hilft jemandem!
Sufinawaz

22

Sie haben viele JSON-Parser für Java :

  • JSONObject.java
    Ein JSONObject ist eine ungeordnete Sammlung von Name / Wert-Paaren. Die externe Form ist eine Zeichenfolge in geschweiften Klammern mit Doppelpunkten zwischen den Namen und Werten und Kommas zwischen den Werten und Namen. Das interne Formular ist ein Objekt mit den Methoden get () und opt () für den Zugriff auf die Werte nach Namen und put () zum Hinzufügen oder Ersetzen von Werten nach Namen. Die Werte können beliebig sein: Boolean, JSONArray, JSONObject, Number und String oder das JSONObject.NULL-Objekt.

  • JSONArray.java
    Ein JSONArray ist eine geordnete Folge von Werten. Die externe Form ist eine Zeichenfolge in eckigen Klammern mit Kommas zwischen den Werten. Das interne Formular ist ein Objekt mit den Methoden get () und opt () für den Zugriff auf die Werte über den Index und den Methoden put () zum Hinzufügen oder Ersetzen von Werten. Die Werte können folgende sein: Boolean, JSONArray, JSONObject, Number und String oder das JSONObject.NULL-Objekt.

  • JSONStringer.java
    Ein JSONStringer ist ein Tool zum schnellen Erstellen von JSON-Text.

  • JSONWriter.java
    Ein JSONWriter ist ein Tool zum schnellen Schreiben von JSON-Text in Streams.

  • JSONTokener.java
    Ein JSONTokener nimmt eine Quellzeichenfolge und extrahiert Zeichen und Token daraus. Es wird von den Konstruktoren JSONObject und JSONArray verwendet, um JSON-Quellzeichenfolgen zu analysieren.

  • JSONException.java
    Eine JSONException wird ausgelöst, wenn eine Syntax oder ein Prozedurfehler erkannt wird.

  • JSONString.java
    Der JSONString ist eine Schnittstelle, über die Klassen ihre JSON-Serialisierung implementieren können.


1
Wenn J2ME eine java.io.IOException hat; 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;, dann könnten Sie die erste verwenden, da es sich um einfache javaKlassen handelt.
Esteban Küber

2
Ich denke, es gibt kein java.lang.reflect-Paket in MIDP 2.0. Wird es schwierig machen, einen generischen Parser zu
erstellen

2
Schlauer Kerl, Voyager, Sie haben gerade die Dokumentation der Standard-Java-JSON-Klassen kopiert.
TheFlash

@ Jeremy Rudd: Natürlich habe ich es getan, wie hast du gedacht, dass ich es so schnell gemacht habe? Es war kein Versuch, dich zu trollen, seine Standardpraxis, sowohl zu verlinken als auch zu kopieren. Es tut mir leid, wenn es so herauskam.
Esteban Küber

10
Ich habe dies abgelehnt, weil es die Frage nicht beantwortet. Es gibt eine Liste verwandter Klassen, aber keine von ihnen erreicht tatsächlich das, was der Fragesteller will.
Jeff Martin

7

Auf der offiziellen JSON-Website sollten Sie nachsehen. Es bietet verschiedene Bibliotheken, die mit Java verwendet werden können. Ich persönlich habe diese verwendet, JSON-lib, die eine Implementierung der Arbeit auf der Site ist, sodass sie genau die gleiche Klasse hat - Methoden usw. auf dieser Seite .

Wenn Sie dort auf die HTML-Links klicken, finden Sie alles, was Sie wollen.

Zusamenfassend:

Um ein JSON-Objekt und ein JSON-Array zu erstellen, lautet der Code:

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

o1, o2 können primitive Typen (long, int, boolean), Strings oder Arrays sein.

Der umgekehrte Vorgang ist ziemlich einfach. Ich meine, eine Zeichenfolge in ein JSON-Objekt / Array konvertieren.

String myString;

JSONObject obj = new JSONObject(myString);

JSONArray array = new JSONArray(myString);

Um korrekt analysiert zu werden, müssen Sie nur wissen, ob Sie ein Array oder ein Objekt analysieren.



5

Wie viele bereits gesagt haben, eine ziemlich einfache Möglichkeit, dies mit JSON.simple wie unten zu tun

import org.json.JSONObject;

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

Verwenden Sie dann jsonObj, um mit JSON Object umzugehen. zB jsonObj.get ("name");

Gemäß dem folgenden Link zeigt JSON.simple eine konstante Effizienz sowohl für kleine als auch für große JSON-Dateien

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


Sie haben geschrieben, dass viele den Vorschlag, den Sie gepostet haben, bereits angegeben haben. Was ist das Wesentliche Ihrer Antwort?
Dakab

1
@dakab Danke für deine Kommentare. Das Wesentliche dieser Frage war, eine einzige Codezeile anzugeben, die den Zweck erfüllt. Und da es dafür viele Apis gibt, wollte ich nur ein paar zusätzliche Informationen zum Vergleich der Effizienz der Apis geben. Das Wesentliche dieser Antwort, die ich meinte, war es, dem Code + einige Informationen über den Vergleich der Effizienz der verschiedenen Apis zu geben, die von anderen Kollegen in diesem Thread erwähnt wurden.
Kripz


3

Dies ist eine alte Frage, und json-simple ( https://code.google.com/p/json-simple/ ) könnte zu diesem Zeitpunkt eine gute Lösung sein. Beachten Sie jedoch, dass das Projekt für eine Weile nicht aktiv zu sein scheint!

Ich schlage den Gson vor, der jetzt gehostet wird unter: https://github.com/google/gson

Wenn die Leistung Ihr Problem ist , können Sie einen Blick auf einige Benchmarks haben http://blog.takipi.com/the-ultimate-json-library-json-simple-vs-gson-vs-jackson-vs-json/ , die zu vergleichen.



2

Ich habe eine Bibliothek geschrieben, die json.org zum Parsen von JSON verwendet, aber tatsächlich einen Proxy einer Schnittstelle für Sie erstellt. Der Code / JAR befindet sich auf code.google.com.

http://fixjures.googlecode.com/

Ich weiß nicht, ob es auf J2ME funktioniert. Da Java Reflection zum Erstellen von Proxys verwendet wird, denke ich, dass dies nicht funktioniert. Außerdem besteht derzeit eine starke Abhängigkeit von Google-Sammlungen, die ich entfernen möchte, und es ist wahrscheinlich zu schwer für Ihre Anforderungen. Sie können jedoch auf die von Ihnen gewünschte Weise mit Ihren JSON-Daten interagieren:

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

Erstaunlich, obwohl ich Foo nicht will, nur das native Objekt.
TheFlash

2

Erstellen Sie einfach ein Json-Objekt in Java mit dem folgenden Json-String. In Ihrem Fall

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

Wenn das Obige Ihre Json-Zeichenfolge ist, erstellen Sie einfach ein Json-Objekt damit.

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 für große Dateien, GSON für kleine Dateien und JSON.simple für beide.


1
Beweise, um @ thangas Kommentar von hier zu sichern blog.takipi.com/…
Gob00st

Ich habe das auch schon einmal gesehen, aber ich denke auch, dass kleine Dateien sowieso schnell zu analysieren sind. Ich würde nur an JSON.simple denken, wenn Sie eine TONNE kleiner Dateien analysieren müssen, in denen sich der Unterschied von etwa 30% gegenüber Jackson summiert. Siehe auch die Top-Kommentare dort, dass der Benchmark möglicherweise nicht zu zuverlässig ist. Wenn Geschwindigkeit für Sie so wichtig ist, sollten Sie wahrscheinlich so gestalten, dass Sie einen Parser einfügen können, um Implementierungen einfach zu ändern, und Ihre eigenen Benchmark-Tests durchführen können.
Benutzer
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.