Ich habe mich gefragt, ob es irgendwo draußen eine Java-Bibliothek gibt, die ein JSONObject abfragen kann. Im Detail suche ich nach etwas wie:
String json = "{ data: { data2 : { value : 'hello'}}}";
...
// Somehow we managed to convert json to jsonObject
...
String result = jsonObject.getAsString("data.data2.value");
System.out.println(result);
Ich erwarte, "Hallo" als Ausgabe zu erhalten.
Der schnellste Weg, den ich gefunden habe, ist Gson:
jsonObject.getAsJsonObject("data").getAsJsonObject().get("data2").getAsJsonObject("value").getAsString();
Es ist eigentlich nicht leicht zu schreiben und zu lesen. Gibt es etwas schnelleres?
Ich habe gerade unerwartet ein sehr interessantes Projekt gefunden: JSON Path
JsonPath ist für JSON das, was XPATH für XML ist. Dies ist eine einfache Methode zum Extrahieren von Teilen eines bestimmten Dokuments.
Mit dieser Bibliothek können Sie das, was Sie wünschen, noch einfacher erledigen, als mein früherer Vorschlag:
String hello = JsonPath.read(json, "$.data.data2.value");
System.out.println(hello); //prints hello
Hoffe, das könnte auch hilfreich sein.
Jackson ist zwar nicht genau dasselbe, aber die Baummodelldarstellung ähnelt Gson:
JsonNode root = objectMapper.readTree(jsonInput);
return root.get("data").get("data2").get("value").asText();
sie müssen es also Schritt für Schritt durchlaufen.
EDIT (August 2015)
Es gibt jetzt (seit Jackson 2.3) Unterstützung für JSON Pointer Expressions mit Jackson. Sie können also alternativ verwenden:
return root.at("/data/data2/value").asText();
Zunächst würde ich empfehlen, die JSON-Objektbindung in Betracht zu ziehen.
Falls Sie jedoch beliebige JSON-Objekte erhalten und diese auf die von Ihnen beschriebene Weise verarbeiten möchten, würde ich vorschlagen, den Jackson JSON-Prozessor mit den Apache Commons Beanutils zu kombinieren.
Die Idee ist die folgende: Jackson verarbeitet standardmäßig alle JSONs als Java.util.Map
-Instanzen. Commons Beanutils vereinfacht dagegen den Zugriff auf Objekte, einschließlich Arrays und Map-Unterstützung.
Sie können es also wie folgt verwenden:
//actually it is a Map instance with maps-fields within
Object jsonObj = objectMapper.readValue(json, Object.class);
Object hello = PropertyUtils.getProperty(jsonObj, "data.data2.value")
System.out.println(hello); //prints hello
Ich denke auf keinen Fall.
Betrachten Sie eine Java-Klasse
class Student {
Subject subject = new Subject();
}
class Subject {
String name;
}
Hier, wenn wir auf den Betreffnamen zugreifen wollen
Student stud = new Student();
stud.subject.name;
Wir können den Zugangsnamen nicht direkt eingeben, wenn dies der Fall ist, erhalten wir keinen korrekten Betreffnamen. Wie hier:
jsonObject.getAsJsonObject("data")
.getAsJsonObject()
.get("data2")
.getAsJsonObject("value")
.getAsString();
Wenn Sie dasselbe Java-Objekt verwenden möchten, verwenden Sie
ClassName classObject = new Gson().fromJson(JsonString, ClassName.class);
ClassName muss über alle Felder verfügen, die mit jsonstring übereinstimmen. Wenn Sie ein Jsonobject in einem Jsonobject haben, müssen Sie eine separate Klasse erstellen, wie ich es in der Student- und Subject-Klasse mache.
Sie können org.json verwenden
String json = "{ data: { data2 : { value : 'hello'}}}";
org.json.JSONObject obj = new org.json.JSONObject(json);
System.out.println(obj.query("/data/data2/value"));