webentwicklung-frage-antwort-db.com.de

Welches zu benutzen? JSONObject von org.json VS JsonObject von javax.json

Dies ist mein erster Beitrag. Als angehender Android-Entwickler las ich SO fast täglich Beiträge zu verschiedenen Themen, aber für diese Frage habe ich keine Hilfe von Google oder SO gefunden.

Meine bisherigen Forschungen:
Die Suche nach dieser Frage war schwieriger als normal, da die Suchmaschinen sich nicht für die Groß- und Kleinschreibung zu interessieren scheinen. Beim Durchsuchen von Google wurden mir nur Links zu den Klassen selbst, alten Artikeln oder völlig irrelevanten Artikeln angezeigt. Am nächsten kam mir JSONArray vs JSONObject, und das ist eine ganz andere Frage. SO Die Suche ergab die gleichen Ergebnisse. Soweit ich das beurteilen kann, beziehen sich ALLE relevanten Beiträge auf SO auf JSONObject und nicht auf JsonObject.

Weder die Oracle- noch die json.org-Dokumentation erwähnte die andere Seite und auch die JSONObject-Seite des Android-Entwicklers, die die org.json-Bibliothek verwendet.

http://docs.Oracle.com/javaee/7/api/javax/json/JsonObject.html
http://www.json.org/javadoc/org/json/JSONObject.html
Ich hätte auch einen Link auf die Android-Referenzseite für JSONObject gepostet, aber meine Vertretung als Neuling ist zu niedrig.

Geschichte der Probleme: Ich las über die Kodierung und Dekodierung von Json von der Oracle-Seite und versuchte, die AndriodStudio IDE zu kopieren und einzufügen, was sofort einen Fehler auslöste, für den keine Import-Anweisung wie es tut normalerweise. Ich habe gelernt, dass die Klasse nicht Bestandteil der integrierten Bibliotheken ist.

Das Problem war, dass der Code, den ich eingefügt habe, JsonObject (das aus der Bibliothek javax.json stammt) und nicht JSONObject (das aus der Bibliothek org.json stammt) verwendet hat. Als ich den Unterschied zwischen der Android-Seite und der Oracle-Seite bemerkte, änderte ich meinen Code von Json in JSON und sofort bot meine IDE die Import-Anweisung org.json an.

Frage (n): Warum gehört eine von Oracle erstellte Klasse nicht zu den Standardbibliotheken, wenn sich eine externe Bibliothek befindet?
Ist JSON der alte, veraltete Weg und Json der neue, richtige Weg?
Sind sie funktional identisch? Wenn nicht, bitte Beispiele angeben.
Sind einige Situationen für die eine besser und einige für die andere besser?
ULTIMATIV, welche sollte ich verwenden und warum (wenn nicht bereits abgedeckt)?
Wenn, javax.json, wo ist der beste (sicherste) Ort, um diese Bibliothek herunterzuladen?

26
Phyxius81

Etwas spät, aber ich wollte meine Meinung dazu teilen.

Dieses Problem hatte ich kürzlich, als ich ein Java-Projekt mit beiden Bibliotheken fand, die gleichzeitig verwendet wurden.

Ich denke, dass org.json aus zwei Hauptgründen (für meine Bedürfnisse) einfacher zu lesen und zu verwenden ist:

  1. JsonObject ist unveränderlich. Sie können keine neuen Schlüssel/Wert-Paare zu einem bereits vorhandenen JsonObject hinzufügen (Referenz hier: javax.json: Neue JsonNumber zu vorhandenem JsonObject hinzufügen )

  2. Es dauert ein paar Zeilen, um ein JsonObject oder JsonArray zu drucken, während es nur eine Zeile für JSONObject oder JSONArray benötigt. Beispiel:

    StringWriter sw = new StringWriter();
    Map<String, Object> properties = new HashMap<>();
    properties.put(JsonGenerator.PRETTY_PRINTING, true);
    
    JsonWriterFactory writerFactory = Json.createWriterFactory(properties);
    JsonWriter jsonWriter = writerFactory.createWriter(sw);
    
    jsonWriter.writeObject(jsonObject); //JsonObject created before
    jsonWriter.close();
    String prettyPrintedJSON = sw.toString();
    

Das ist der Code, den ich verwende, um eine eingerückte JSON zum Schreiben in eine Datei zu erhalten. Und mit org.json brauche ich nur jsonObject.toString(4)

Ein weiterer Unterschied sind die Konstrukteure. Sie benötigen eine JsonObjectBuilder, um eine JSON mit javax.json zu erstellen. Ein weiterer Schritt kann vermieden werden.

Ich bin sicher, dass es mehr Unterschiede gibt (nicht sicher, ob es möglich ist, aus einem String ein JsonObject zu erstellen), aber dies sind meine Gedanken.

14
Samuel Méndez

JSONObject wird, wie erwähnt, von der Android-API bereitgestellt. JsonObject wird speziell für die Java EE-Entwicklung verwendet, die sich unter anderem für Webanwendungen und Netzwerkfunktionen eignet. 

Der Grund, warum Android JsonObject nicht aus dem Java-EE-Paket von Oracle bereitstellt, liegt darin, dass viele der Dinge, die javax ausführen kann, innerhalb von Android nicht erlaubt sind, ohne Erlaubnis auf das Internet zuzugreifen. Dies bedeutet, dass der Import der gesamten JARAX-Dateien mit Android in Konflikt steht.

Wenn Sie ein eigenes Backend mit Java EE erstellen möchten, würde ich dringend empfehlen, JsonObject über JSONObject zu verwenden. Auf der anderen Seite, wenn Sie einen vorgefertigten Rest-Service oder etwas Ähnliches kennen, das Android JSON noch besser unterstützt. 

2
Full Stack

Ich empfehle Ihnen, das json-simple toolkit von Google zu verwenden, um mit JSON-Objekten arbeiten zu können. Es bietet nützliche Funktionen und ist nicht von externen Bibliotheken abhängig, was sich bei der Entwicklung von Android-Apps als enormes Problem erwies.

Um Ihre Frage zu beantworten: Wenn Sie json-simple in Ihrem Projekt nicht verwenden möchten, sollten Sie das JSONObject von org.json verwenden, da es vom Android-JDK bereitgestellt wird. Weitere Informationen finden Sie unter http://developer.Android.com/reference/org/json/JSONObject.html .

0
michip96