it-swarm.com.de

Fragen Sie ein JSONObject in Java ab

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?

31
Pamput

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.

37
n1ckolas

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();
19
StaxMan

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
16
n1ckolas

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.

1
Parvathy

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