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"
             }
        ]
    }

701voto

SDekov Punkte 8531

Für dieses Beispiel nehmen wir an, Sie haben eine Klasse Person mit nur einem name .

private class Person {
    public String name;

    public Person(String name) {
        this.name = name;
    }
}

Google GSON ( Maven )

Mein persönlicher Favorit in Bezug auf die großartige JSON-Serialisierung/Deserialisierung von Objekten.

Gson g = new Gson();

Person person = g.fromJson("{\"name\": \"John\"}", Person.class);
System.out.println(person.name); //John

System.out.println(g.toJson(person)); // {"name":"John"}

Update

Wenn Sie ein einzelnes Attribut herausfinden möchten, können Sie dies auch mit der Google-Bibliothek tun:

JsonObject jsonObject = new JsonParser().parse("{\"name\": \"John\"}").getAsJsonObject();

System.out.println(jsonObject.get("name").getAsString()); //John

Org.JSON ( Maven )

Wenn Sie keine De-Serialisierung von Objekten benötigen, sondern einfach nur ein Attribut erhalten möchten, können Sie org.json ( oder siehe GSON-Beispiel oben! )

JSONObject obj = new JSONObject("{\"name\": \"John\"}");

System.out.println(obj.getString("name")); //John

Jackson ( Maven )

ObjectMapper mapper = new ObjectMapper();
Person user = mapper.readValue("{\"name\": \"John\"}", Person.class);

System.out.println(user.name); //John

116voto

nondescript Punkte 1376
  1. Wenn man ein Java-Objekt aus JSON erstellen will und umgekehrt, verwendet man GSON oder JACKSON Jars von Drittanbietern usw.

    //from object to JSON 
    Gson gson = new Gson();
    gson.toJson(yourObject);
    
    // from JSON to object 
    yourObject o = gson.fromJson(JSONString,yourObject.class);
  2. Aber wenn man nur eine JSON-Zeichenkette parsen und einige Werte erhalten möchte (oder eine JSON-Zeichenkette von Grund auf neu erstellen, um sie über Draht zu senden), verwenden Sie einfach JaveEE jar, die JsonReader, JsonArray, JsonObject usw. enthält. Vielleicht möchten Sie die Implementierung dieser Spezifikation wie javax.json herunterladen. Mit diesen beiden Jars bin ich in der Lage, die Json zu parsen und die Werte zu verwenden.

    Diese APIs folgen eigentlich dem DOM/SAX-Parsing-Modell von XML.

    Response response = request.get(); // REST call 
        JsonReader jsonReader = Json.createReader(new StringReader(response.readEntity(String.class)));
        JsonArray jsonArray = jsonReader.readArray();
        ListIterator l = jsonArray.listIterator();
        while ( l.hasNext() ) {
              JsonObject j = (JsonObject)l.next();
              JsonObject ciAttr = j.getJsonObject("ciAttributes");

82voto

rputta Punkte 903

quick-json parser ist sehr einfach, flexibel, sehr schnell und anpassbar. Probieren Sie es aus

Merkmale:

  • Konform mit der JSON-Spezifikation (RFC4627)
  • Leistungsstarker JSON-Parser
  • Unterstützt flexiblen/konfigurierbaren Parsing-Ansatz
  • Konfigurierbare Validierung von Schlüssel/Wert-Paaren einer beliebigen JSON-Hierarchie
  • Einfach zu bedienen # Sehr geringer Platzbedarf
  • löst entwicklerfreundliche und leicht zu verfolgende Ausnahmen aus
  • Steckbare benutzerdefinierte Validierungsunterstützung - Schlüssel/Werte können durch die Konfiguration von benutzerdefinierten Validierern validiert werden, wenn sie angetroffen werden.
  • Validierende und nicht-validierende Parser-Unterstützung
  • Unterstützung für zwei Konfigurationstypen (JSON/XML) für die Verwendung des Quick-JSON-Validierungsparsers
  • Erfordert JDK 1.5
  • Keine Abhängigkeit von externen Bibliotheken
  • Unterstützung für JSON-Generierung durch Objektserialisierung
  • Unterstützung für die Auswahl des Sammlungstyps während des Parsing-Prozesses

Sie kann wie folgt verwendet werden:

JsonParserFactory factory=JsonParserFactory.getInstance();
JSONParser parser=factory.newJsonParser();
Map jsonMap=parser.parseJson(jsonString);

47voto

Levent Divilioglu Punkte 10350

A - Erläuterung

Sie können verwenden Jackson Bibliotheken, für die Einbindung von JSON String in POJO ( Einfaches altes Java-Objekt ) Instanzen. POJO ist einfach eine Klasse mit nur privaten Feldern und öffentlichen Getter/Setter-Methoden. Jackson wird die Methoden durchlaufen (mit Reflexion ), und ordnet das JSON-Objekt der POJO-Instanz zu, da die Feldnamen der Klasse zu den Feldnamen des JSON-Objekts passen.

In Ihrem JSON-Objekt, das eigentlich ein Verbundwerkstoff Objekt besteht das Hauptobjekt aus zwei Unterobjekten. Unsere POJO-Klassen sollten also die gleiche Hierarchie haben. Ich werde das gesamte JSON-Objekt als Seite Objekt. Seite Objekt besteht aus einem SeiteInfo Objekt, und ein Beitrag Objekt-Array.

Wir müssen also drei verschiedene POJO-Klassen erstellen;

  • Seite Klasse, eine Zusammensetzung aus SeiteInfo Klasse und Array von Beitrag Instanzen
  • SeiteInfo Klasse
  • Beiträge Klasse

Das einzige Paket, das ich verwendet habe, ist Jackson ObjectMapper, was wir tun, ist die Bindung von Daten;

com.fasterxml.jackson.databind.ObjectMapper

Die erforderlichen Abhängigkeiten, die jar-Dateien, sind unten aufgeführt;

  • jackson-core-2.5.1.jar
  • jackson-databind-2.5.1.jar
  • jackson-anmerkungen-2.5.0.jar

Hier ist der erforderliche Code;

B - Haupt-POJO-Klasse: Seite

package com.levo.jsonex.model;

public class Page {

    private PageInfo pageInfo;
    private Post[] posts;

    public PageInfo getPageInfo() {
        return pageInfo;
    }

    public void setPageInfo(PageInfo pageInfo) {
        this.pageInfo = pageInfo;
    }

    public Post[] getPosts() {
        return posts;
    }

    public void setPosts(Post[] posts) {
        this.posts = posts;
    }

}

C - Untergeordnete POJO-Klasse: PageInfo

package com.levo.jsonex.model;

public class PageInfo {

    private String pageName;
    private String pagePic;

    public String getPageName() {
        return pageName;
    }

    public void setPageName(String pageName) {
        this.pageName = pageName;
    }

    public String getPagePic() {
        return pagePic;
    }

    public void setPagePic(String pagePic) {
        this.pagePic = pagePic;
    }

}

D - Untergeordnete POJO-Klasse: Post

package com.levo.jsonex.model;

public class Post {

    private String post_id;
    private String actor_id;
    private String picOfPersonWhoPosted;
    private String nameOfPersonWhoPosted;
    private String message;
    private int likesCount;
    private String[] comments;
    private int timeOfPost;

    public String getPost_id() {
        return post_id;
    }

    public void setPost_id(String post_id) {
        this.post_id = post_id;
    }

    public String getActor_id() {
        return actor_id;
    }

    public void setActor_id(String actor_id) {
        this.actor_id = actor_id;
    }

    public String getPicOfPersonWhoPosted() {
        return picOfPersonWhoPosted;
    }

    public void setPicOfPersonWhoPosted(String picOfPersonWhoPosted) {
        this.picOfPersonWhoPosted = picOfPersonWhoPosted;
    }

    public String getNameOfPersonWhoPosted() {
        return nameOfPersonWhoPosted;
    }

    public void setNameOfPersonWhoPosted(String nameOfPersonWhoPosted) {
        this.nameOfPersonWhoPosted = nameOfPersonWhoPosted;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public int getLikesCount() {
        return likesCount;
    }

    public void setLikesCount(int likesCount) {
        this.likesCount = likesCount;
    }

    public String[] getComments() {
        return comments;
    }

    public void setComments(String[] comments) {
        this.comments = comments;
    }

    public int getTimeOfPost() {
        return timeOfPost;
    }

    public void setTimeOfPost(int timeOfPost) {
        this.timeOfPost = timeOfPost;
    }

}

E - Beispiel-JSON-Datei: sampleJSONFile.json

Ich habe gerade Ihr JSON-Beispiel in diese Datei kopiert und sie in den Projektordner gelegt.

{
   "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"
         }
    ]
}

F - Demo-Code

package com.levo.jsonex;

import java.io.File;
import java.io.IOException;
import java.util.Arrays;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.levo.jsonex.model.Page;
import com.levo.jsonex.model.PageInfo;
import com.levo.jsonex.model.Post;

public class JSONDemo {

    public static void main(String[] args) {
        ObjectMapper objectMapper = new ObjectMapper();

        try {
            Page page = objectMapper.readValue(new File("sampleJSONFile.json"), Page.class);

            printParsedObject(page);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    private static void printParsedObject(Page page) {
        printPageInfo(page.getPageInfo());
        System.out.println();
        printPosts(page.getPosts());
    }

    private static void printPageInfo(PageInfo pageInfo) {
        System.out.println("Page Info;");
        System.out.println("**********");
        System.out.println("\tPage Name : " + pageInfo.getPageName());
        System.out.println("\tPage Pic  : " + pageInfo.getPagePic());
    }

    private static void printPosts(Post[] posts) {
        System.out.println("Page Posts;");
        System.out.println("**********");
        for(Post post : posts) {
            printPost(post);
        }
    }

    private static void printPost(Post post) {
        System.out.println("\tPost Id                   : " + post.getPost_id());
        System.out.println("\tActor Id                  : " + post.getActor_id());
        System.out.println("\tPic Of Person Who Posted  : " + post.getPicOfPersonWhoPosted());
        System.out.println("\tName Of Person Who Posted : " + post.getNameOfPersonWhoPosted());
        System.out.println("\tMessage                   : " + post.getMessage());
        System.out.println("\tLikes Count               : " + post.getLikesCount());
        System.out.println("\tComments                  : " + Arrays.toString(post.getComments()));
        System.out.println("\tTime Of Post              : " + post.getTimeOfPost());
    }

}

G - Demo-Ausgang

Page Info;
****(*****
    Page Name : abc
    Page Pic  : http://example.com/content.jpg
Page Posts;
**********
    Post Id                   : 123456789012_123456789012
    Actor Id                  : 1234567890
    Pic Of Person Who Posted  : http://example.com/photo.jpg
    Name Of Person Who Posted : Jane Doe
    Message                   : Sounds cool. Can't wait to see it!
    Likes Count               : 2
    Comments                  : []
    Time Of Post              : 1234567890

46voto

dade Punkte 2839

Bei fast allen Antworten ist eine vollständige Deserialisierung der JSON-Datei in ein Java-Objekt erforderlich, bevor auf den Wert der gewünschten Eigenschaft zugegriffen werden kann. Eine andere Alternative, die diesen Weg nicht geht, ist die Verwendung von JsonPATH die wie XPath für JSON ist und das Traversieren von JSON-Objekten ermöglicht.

Es handelt sich um eine Spezifikation, und die guten Leute von JayWay haben eine Java-Implementierung für die Spezifikation erstellt, die Sie hier finden können: https://github.com/jayway/JsonPath

Um sie zu verwenden, fügen Sie sie zu Ihrem Projekt hinzu, z. B:

<dependency>
    <groupId>com.jayway.jsonpath</groupId>
    <artifactId>json-path</artifactId>
    <version>${version}</version>
</dependency>

und zu verwenden:

String pageName = JsonPath.read(yourJsonString, "$.pageInfo.pageName");
String pagePic = JsonPath.read(yourJsonString, "$.pageInfo.pagePic");
String post_id = JsonPath.read(yourJsonString, "$.pagePosts[0].post_id");

usw...

Auf der JsonPath-Spezifikationsseite finden Sie weitere Informationen zu den anderen Möglichkeiten, JSON zu übertragen.

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