Frage Wie man JSON in Java parsen kann


Ich habe den folgenden JSON-Text. Wie kann ich es analysieren, um zu bekommen? pageName, pagePic, post_id, etc.?

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

762
2018-04-07 09:00


Ursprung


Antworten:


Das org.json Bibliothek ist einfach zu bedienen. Beispielcode unten:

import org.json.*;


JSONObject obj = new JSONObject(" .... ");
String pageName = obj.getJSONObject("pageInfo").getString("pageName");

JSONArray arr = obj.getJSONArray("posts");
for (int i = 0; i < arr.length(); i++)
{
    String post_id = arr.getJSONObject(i).getString("post_id");
    ......
}

Sie finden vielleicht weitere Beispiele von: Parsen Sie JSON in Java

Herunterladbares Glas: http://mvnrepository.com/artifact/org.json/json


575
2017-09-25 06:56



Für das 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 bezüglich der großartigen JSON-Serialisierung / -Derialisierung 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"}

Aktualisieren

Wenn Sie ein einzelnes Attribut erhalten 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 Objekt-Deserialisierung benötigen, sondern einfach ein Attribut erhalten, können Sie org.json (oder schau 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

409
2017-07-31 09:54



  1. Wenn Sie ein JAVA-Objekt von JSON und umgekehrt erstellen möchten, verwenden Sie GSON- oder JACKSON-Drittanbieter-Jars 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-Zeichenfolge parsen und einige Werte erhalten möchte (ODER eine JSON-Zeichenfolge von Grund auf neu erstellen, um sie zu verschicken), verwende einfach JaveEE jar, das JsonReader, JsonArray, JsonObject usw. enthält. Vielleicht möchtest du die Implementierung davon herunterladen Spezifikation wie javax.json. Mit diesen zwei Gläsern kann ich den JSon analysieren und die Werte verwenden.

    Diese APIs folgen tatsächlich dem DOM / SAX-Parsingmodell 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");
    

68
2018-02-18 23:34



Schnell-JSON-Parser ist sehr einfach, flexibel, sehr schnell und anpassbar. Versuch es

Eigenschaften:

  • Konform mit der JSON-Spezifikation (RFC4627)
  • Hochleistungs-JSON-Parser
  • Unterstützt flexiblen / konfigurierbaren Parsing-Ansatz
  • Konfigurierbare Validierung von Schlüssel / Wert-Paaren beliebiger JSON-Hierarchie
  • Einfach zu bedienen # Sehr kleiner Platzbedarf
  • Hebt entwicklerfreundliche und leicht nachvollziehbare Ausnahmen auf
  • Pluggable Custom Validation-Unterstützung - Schlüssel / Werte können überprüft werden, indem benutzerdefinierte Validatoren nach Bedarf konfiguriert werden
  • Validierung und Nicht-Validierung von Parser-Unterstützung
  • Unterstützung für zwei Konfigurationstypen (JSON / XML) für die Verwendung von Quick-JSON Validierungs-Parser
  • Benötigt JDK 1.5
  • Keine Abhängigkeit von externen Bibliotheken
  • Unterstützung für die JSON-Generierung durch Objektserialisierung
  • Unterstützung für die Auswahl des Sammlertyps während des Analyseprozesses

Es kann so verwendet werden:

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

61
2018-02-24 06:24



Fast alle gegebenen Antworten erfordern eine vollständige Deserialisierung des JSON in ein Java-Objekt, bevor auf den Wert in der Eigenschaft von Interesse zugegriffen wird. Eine andere Alternative, die diesen Weg nicht geht, ist zu benutzen JsonPATH Das ist wie XPath für JSON und ermöglicht das Traversieren von JSON-Objekten.

Es ist 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

Also im Grunde, um es zu verwenden, fügen Sie es Ihrem Projekt hinzu, zB:

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

etc...

Weitere Informationen zu den anderen Möglichkeiten zum Query-JSON finden Sie auf der JsonPath-Spezifikationsseite.


25
2017-12-16 13:51



A - Erklärung

Sie können verwenden Jackson Bibliotheken zum Binden 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 (unter Verwendung von Betrachtung) 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 ist eigentlich ein zusammengesetzt Objekt besteht das Hauptobjekt aus zwei Unterobjekten. Unsere POJO-Klassen sollten also die gleiche Hierarchie haben. Ich werde das ganze JSON-Objekt als aufrufen Seite Objekt. Seite Objekt besteht aus a Seiteninfo Objekt und a Post Objekt-Array.

Also müssen wir drei verschiedene POJO-Klassen erstellen;

  • Seite Klasse, eine Zusammensetzung von Seiteninfo Klasse und Array von Post Instanzen
  • Seiteninfo Klasse
  • Beiträge Klasse

Das einzige Paket, das ich benutzt habe, ist Jackson ObjectMapper, was wir tun, ist Daten zu binden;

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:

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 - Child 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 - Kind POJO Klasse: Posten

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 unter dem Projektordner abgelegt.

{
   "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 - Democode

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 - Demoausgabe

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

24
2017-07-12 19:06



Du könntest benutzen Google Gson.

Mit dieser Bibliothek müssen Sie nur ein Modell mit derselben JSON-Struktur erstellen. Dann wird das Modell automatisch ausgefüllt. Sie müssen Ihre Variablen als Ihre JSON-Schlüssel aufrufen oder @SerializedName verwenden, wenn Sie andere Namen verwenden möchten.

Für Ihr Beispiel:

JSON:

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

}

Modell:

class MyModel {

    private PageInfo pageInfo;
    private ArrayList<Post> posts = new ArrayList<>();
}

class PageInfo {

    private String pageName;
    private String pagePic;
}

class Post {

    private String post_id;

    @SerializedName("actor_id") // <- example SerializedName
    private String actorId;

    private String picOfPersonWhoPosted;
    private String nameOfPersonWhoPosted;
    private String message;
    private String likesCount;
    private ArrayList<String> comments;
    private String timeOfPost;
}

Jetzt können Sie mit der Gson-Bibliothek analysieren:

MyModel model = gson.fromJson(jsonString, MyModel.class);

Sie können ein Modell aus JSON automatisch mit Online-Tools wie Dies.


20
2018-06-01 15:20