1335 Stimmen

Wie man JSON in Java parst

Ich habe den folgenden JSON-Text. Wie kann ich ihn parsen, um die Werte von pageName , pagePic , post_id usw.?

    {
       "pageInfo": {
             "pageName": "abc",
             "pagePic": "http://example.com/content.jpg"
        },
        "posts": [
             {
                  "post_id": "123456789012_123456789012",
                  "actor_id": "1234567890",
                  "picOfPersonWhoPosted": "http://example.com/photo.jpg",
                  "nameOfPersonWhoPosted": "Jane Doe",
                  "message": "Sounds cool. Can't wait to see it!",
                  "likesCount": "2",
                  "comments": [],
                  "timeOfPost": "1234567890"
             }
        ]
    }

32voto

Verwenden Sie minimal-json die sehr schnell und einfach zu bedienen ist. Sie können von String obj und Stream parsen.

Beispielhafte Daten:

{
  "order": 4711,
  "items": [
    {
      "name": "NE555 Timer IC",
      "cat-id": "645723",
      "quantity": 10,
    },
    {
      "name": "LM358N OpAmp IC",
      "cat-id": "764525",
      "quantity": 2
    }
  ]
}

Parsing:

JsonObject object = Json.parse(input).asObject();
int orders = object.get("order").asInt();
JsonArray items = object.get("items").asArray();

JSON erstellen:

JsonObject user = Json.object().add("name", "Sakib").add("age", 23);

Maven:

<dependency>
  <groupId>com.eclipsesource.minimal-json</groupId>
  <artifactId>minimal-json</artifactId>
  <version>0.9.4</version>
</dependency>

27voto

justin.hughey Punkte 1216

Das folgende Beispiel zeigt, wie der Text in der Frage, dargestellt als Variable "jsonText", gelesen werden kann. Diese Lösung verwendet die Java EE7 javax.json API (die in einigen der anderen Antworten erwähnt wird). Der Grund, warum ich es als separate Antwort hinzugefügt habe, ist, dass der folgende Code zeigt, wie man eigentlich auf einige der in der Frage genannten Werte zugreifen. Eine Implementierung der javax.json API erforderlich, damit dieser Code ausgeführt werden kann. Das vollständige Paket für jede der erforderlichen Klassen wurde aufgenommen, da ich keine "Import"-Anweisungen deklarieren wollte.

javax.json.JsonReader jr = 
    javax.json.Json.createReader(new StringReader(jsonText));
javax.json.JsonObject jo = jr.readObject();

//Read the page info.
javax.json.JsonObject pageInfo = jo.getJsonObject("pageInfo");
System.out.println(pageInfo.getString("pageName"));

//Read the posts.
javax.json.JsonArray posts = jo.getJsonArray("posts");
//Read the first post.
javax.json.JsonObject post = posts.getJsonObject(0);
//Read the post_id field.
String postId = post.getString("post_id");

Nun, bevor jemand geht und downvotes diese Antwort, weil es nicht verwenden GSON, org.json, Jackson oder einer der anderen 3rd-Party-Frameworks zur Verfügung, es ist ein Beispiel für "erforderlichen Code" pro die Frage, um den angegebenen Text zu analysieren. Ich bin mir sehr wohl bewusst, dass die Einhaltung des aktuellen Standards JSR 353 wurde für JDK 9 nicht in Betracht gezogen und als solche die JSR 353-Spezifikation sollte genauso behandelt werden wie jede andere Implementierung von Drittanbietern zur JSON-Behandlung.

23voto

Giovanni Botta Punkte 9336

Meiner Meinung nach sollte die beste Vorgehensweise darin bestehen, die offizielle Java JSON API die sich noch in der Entwicklung befinden.

23voto

otonglet Punkte 3130

Da es noch niemand erwähnt hat, hier ein Lösungsansatz mit Nashorn (JavaScript-Laufzeitteil von Java 8, aber veraltet in Java 11).

Lösung

private static final String EXTRACTOR_SCRIPT =
    "var fun = function(raw) { " +
    "var json = JSON.parse(raw); " +
    "return [json.pageInfo.pageName, json.pageInfo.pagePic, json.posts[0].post_id];};";

public void run() throws ScriptException, NoSuchMethodException {
    ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
    engine.eval(EXTRACTOR_SCRIPT);
    Invocable invocable = (Invocable) engine;
    JSObject result = (JSObject) invocable.invokeFunction("fun", JSON);
    result.values().forEach(e -> System.out.println(e));
}

Leistungsvergleich

Ich habe JSON-Inhalte geschrieben, die drei Arrays mit jeweils 20, 20 und 100 Elementen enthalten. Ich möchte nur die 100 Elemente aus dem dritten Array abrufen. Ich verwende die folgende JavaScript-Funktion zum Parsen und Abrufen meiner Einträge.

var fun = function(raw) {JSON.parse(raw).entries};

Den Aufruf eine Million Mal mit Nashorn dauert 7,5~7,8 Sekunden

(JSObject) invocable.invokeFunction("fun", json);

org.json dauert 20~21 Sekunden

new JSONObject(JSON).getJSONArray("entries");

Jackson dauert 6,5~7 Sekunden

mapper.readValue(JSON, Entries.class).getEntries();

In diesem Fall schneidet Jackson besser ab als Nashorn, das wiederum viel besser abschneidet als org.json. Die Nashorn-API ist schwieriger zu benutzen als die von org.json oder Jackson. Abhängig von Ihren Anforderungen können sowohl Jackson als auch Nashorn praktikable Lösungen sein.

13voto

fabien Punkte 1429

Es gibt viele JSON-Bibliotheken, die in Java verfügbar sind.

Die bekanntesten davon sind: Jackson, GSON, Genson, FastJson und org.json.

Bei der Auswahl einer Bibliothek sollte man in der Regel auf drei Dinge achten:

  1. Leistung
  2. Benutzerfreundlichkeit (der Code ist einfach zu schreiben und lesbar) - das gilt auch für die Funktionen.
  3. Für mobile Anwendungen: Größe der Abhängigkeiten/jar

Speziell für JSON-Bibliotheken (und alle Serialisierungs-/Deserialisierungs-Bibliotheken) ist das Databinding in der Regel ebenfalls von Interesse, da es das Schreiben von Boiler-Plate-Code zum Packen/Entpacken der Daten überflüssig macht.

Für 1, siehe diesen Benchmark: https://github.com/fabienrenaud/java-json-benchmark Ich habe mit JMH die die Leistung von Serialisierern und Deserialisierern (jackson, gson, genson, fastjson, org.json, jsonp) unter Verwendung von Stream- und Databind-APIs vergleicht. Für 2 können Sie zahlreiche Beispiele im Internet finden. Der obige Benchmark kann auch als Quelle für Beispiele verwendet werden...

Kurzes Fazit des Benchmarks: Jackson ist 5 bis 6 Mal besser als org.json und mehr als doppelt so gut wie GSON.

Für Ihr spezielles Beispiel dekodiert der folgende Code Ihr json mit jackson:

public class MyObj {

    private PageInfo pageInfo;
    private List<Post> posts;

    static final class PageInfo {
        private String pageName;
        private String pagePic;
    }

    static final class Post {
        private String post_id;
        @JsonProperty("actor_id");
        private String actorId;
        @JsonProperty("picOfPersonWhoPosted")
        private String pictureOfPoster;
        @JsonProperty("nameOfPersonWhoPosted")
        private String nameOfPoster;
        private String likesCount;
        private List<String> comments;
        private String timeOfPost;
    }

    private static final ObjectMapper JACKSON = new ObjectMapper();
    public static void main(String[] args) throws IOException {
        MyObj o = JACKSON.readValue(args[0], MyObj.class); // assumes args[0] contains your json payload provided in your question.
    }
}

Lassen Sie mich wissen, wenn Sie Fragen haben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X