Hoe parse JSON in Java

Ik heb de volgende JSON tekst. Hoe kan ik het ontleden om de waarden van krijgen pageName, pagePic, post_id, enz.?

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

1, Autoriteit 100%

De org.json bibliotheek is eenvoudig te gebruiken.

Vergeet niet (tijdens het gieten of met behulp van methoden zoals getJSONObjecten getJSONArray), die in JSON notatie

  • [ … ]staat voor een serie, zodat bibliotheek zal ontleden tot JSONArray
  • { … }staat voor een object, zodat bibliotheek zal ontleden tot JSONObject

Voorbeeldcode hieronder:

import org.json.*;
String jsonString = ... ; //assign your JSON String here
JSONObject obj = new JSONObject(jsonString);
String pageName = obj.getJSONObject("pageInfo").getString("pageName");
JSONArray arr = obj.getJSONArray("posts"); // notice that `"posts": [...]`
for (int i = 0; i < arr.length(); i++)
{
    String post_id = arr.getJSONObject(i).getString("post_id");
    ......
}

U kunt meer voorbeelden vinden van: JSON parseren in Java

Downloadbare jar: http://mvnrepository.com/artifact/org.json/json


Antwoord 2, autoriteit 71%

Laten we voor het voorbeeld aannemen dat je een klasse Personhebt met alleen een name.

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

Google GSON(Maven)

Mijn persoonlijke favoriet wat betreft de geweldige JSON-serialisatie / de-serialisatie van objecten.

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

Bijwerken

Als u één kenmerk wilt gebruiken, kunt u dat ook gemakkelijk doen met de Google-bibliotheek:

JsonObject jsonObject = new JsonParser().parse("{\"name\": \"John\"}").getAsJsonObject();
System.out.println(jsonObject.get("name").getAsString()); //John

Org.JSON(Maven)

Als u de-serialisatie van objecten niet nodig hebt, maar gewoon een attribuut wilt krijgen, kunt u org.json proberen (of kijk eens naar het GSON-voorbeeld hierboven!)

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

Antwoord 3, autoriteit 13%

  1. Als men een Java-object van JSON wil maken en vice versa, gebruik dan GSON- of JACKSON-potten van derden enz.

    //from object to JSON 
    Gson gson = new Gson();
    gson.toJson(yourObject);
    // from JSON to object 
    yourObject o = gson.fromJson(JSONString,yourObject.class);
    
  2. Maar als je gewoon een JSON-tekenreeks wilt ontleden en een aantal waarden wilt krijgen (OF een geheel nieuwe JSON-tekenreeks wilt maken om over de draad te verzenden), gebruik dan gewoon JaveEE-jar die JsonReader, JsonArray, JsonObject enz. om de implementatie van die specificatie te downloaden, zoals javax.json. Met deze twee potten kan ik de json ontleden en de waarden gebruiken.

    Deze API’s volgen eigenlijk het DOM/SAX-parseermodel van 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");
    

Antwoord 4, autoriteit 9%

quick-json-parseris zeer eenvoudig, flexibel, zeer snel en aanpasbaar. Probeer het

Kenmerken:

  • Voldoet aan de JSON-specificatie (RFC4627)
  • Hoogwaardige JSON-parser
  • Ondersteunt flexibele/configureerbare parsing-aanpak
  • Configureerbare validatie van sleutel/waarde-paren van elke JSON-hiërarchie
  • Eenvoudig te gebruiken # Zeer kleine voetafdruk
  • Verhoogt ontwikkelaarsvriendelijke en gemakkelijk te traceren uitzonderingen
  • Insteekbare ondersteuning voor aangepaste validatie – Sleutels/waarden kunnen worden gevalideerd door aangepaste validators te configureren wanneer ze worden aangetroffen
  • Validerende en niet-validerende parserondersteuning
  • Ondersteuning voor twee soorten configuratie (JSON/XML) voor het gebruik van quick-JSON validerende parser
  • JDK 1.5 vereist
  • Geen afhankelijkheid van externe bibliotheken
  • Ondersteuning voor JSON Generation via objectserialisatie
  • Ondersteuning voor selectie van collectietype tijdens parseerproces

Het kan als volgt worden gebruikt:

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

Antwoord 5, autoriteit 6%

Je zou Google Gsonkunnen gebruiken.

Gebruik van deze bibliotheek hoeft u alleen een model te maken met dezelfde JSON-structuur. Dan wordt het model automatisch ingevuld. U moet uw variabelen bellen als uw JSE-sleutels, of gebruik @SerializedNameAls u verschillende namen wilt gebruiken.

JSON

Uit uw voorbeeld:

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

MODEL

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;
}

parseren

Nu kunt u parseren met behulp van GSON-bibliotheek:

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

Gradle importeren

Vergeet niet om de bibliotheek in het Gradle-bestand van de app te importeren

implementation 'com.google.code.gson:gson:2.8.6' // or earlier versions

Automatische modelgeneratie

Je kunt automatisch een model van JSON genereren met online tools zoals dit.


Antwoord 6, autoriteit 5%

Bijna alle gegeven antwoorden vereisen een volledige deserialisatie van de JSON in een Java-object voordat toegang wordt verkregen tot de waarde in de betreffende eigenschap. Een ander alternatief, dat deze route niet volgt, is om JsonPATHte gebruiken, wat vergelijkbaar is met XPath voor JSON en het doorlopen van JSON-objecten.

Het is een specificatie en de goede mensen bij JayWay hebben een Java-implementatie voor de specificatie gemaakt die je hier kunt vinden: https://github.com/jayway/JsonPath

Dus eigenlijk om het te gebruiken, voeg het toe aan je project, bijvoorbeeld:

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

en te gebruiken:

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 …

Controleer de JsonPath specificatie pagina voor meer informatie over de andere manieren om JSON dwars.


7, Autoriteit 5%

A – Toelichting

U kunt Jackson bibliotheken, voor het binden van JSON string in POJO (Plain Old Java-object ) instances . POJO is gewoon een klasse met slechts private velden en publieke getter / setter methoden. Jackson gaat naar de methoden doorkruisen (met reflectie), en brengt de JSON object in de POJO bijvoorbeeld als de veldnamen van de klasse past de veldnamen van de JSON object.

In je JSON object, die eigenlijk een composite object, het hoofddoel bestaat o twee sub-objecten. Dus, moet onze POJO klassen dezelfde hiërarchie hebben. Ik zal de hele JSON object als Pagina’s object noemen. object uit een PageInfo object en een bericht object array.

Dus we hebben drie verschillende POJO klassen te creëren;

  • Pagina’s Class, een composiet van PageInfo Class en de vele bericht Instances
  • PageInfo Class
  • Posts Class

Het enige pakket dat ik heb gebruikt is Jackson ObjectMapper, wat we doen is bindend data;

com.fasterxml.jackson.databind.ObjectMapper

De vereiste afhankelijkheden, de jar bestanden wordt hieronder vermeld;

  • jackson-core-2.5.1.jar
  • jackson-DataBind-2.5.1.jar
  • jackson-annotaties-2.5.0.jar

Hier is de vereiste code;

B – Main POJO klasse: Pagina’s

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 – POJO-klasse voor kinderen: 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 – POJO-klas voor kinderen: bericht

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 – Voorbeeld JSON-bestand: sampleJSONFile.json

Ik heb zojuist je JSON-voorbeeld naar dit bestand gekopieerd en onder de projectmap geplaatst.

{
   "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 – Demo-uitvoer

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

8, Autoriteit 3%

Gebruik minimal-json die erg snel en gemakkelijk te gebruiken is.
Je kunt parse van string obj en stream.

Voorbeeldgegevens:

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

parseren:

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

JSON CREATED:

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>

Antwoord 9, autoriteit 3%

Het onderstaande voorbeeld laat zien hoe de tekst in de vraag gelezen moet worden, weergegeven als de “jsonText” variabele. Deze oplossing maakt gebruik van de Java EE7 javax.jsonAPI (die in sommige van de andere antwoorden wordt genoemd). De reden dat ik het als een apart antwoord heb toegevoegd, is dat de volgende code laat zien hoe je eigenlijktoegang krijgt tot enkele van de waarden die in de vraag worden getoond. Een implementatie van de javax.json APIis vereist om deze code uit te voeren. Het volledige pakket voor elk van de vereiste klassen was inbegrepen omdat ik geen “import”-statements wilde declareren.

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

Nu, voordat iemand dit antwoord naar beneden gaat, omdat het GSON, org.json, Jackson of een van de andere beschikbare derde partij-frameworks niet gebruikt, is het een voorbeeld van “vereiste code” per de vraag om het te ontleden verstrekt tekst. Ik ben me er goed van bewust dat naleving van de huidige standaard JSR 353 werd niet overwogen voor JDK 9 en als Zo’n JSR 353 spec moet hetzelfde worden behandeld als elke andere 3e partij JSON-behandeling implementatie.


10, Autoriteit 3%

Sinds niemand het al zei, is hier een begin van een oplossing met behulp van nashorn (JavaScript Runtime-deel van Java 8, maar verouderd in Java 11).

oplossing

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

Performance vergelijking

Ik schreef JSON-inhoud met drie reeks respectievelijk 20, 20 en 100 elementen. Ik wil alleen de 100 elementen uit de derde array krijgen. Ik gebruik de volgende JavaScript-functie om te ontleden en mijn inzendingen te krijgen.

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

Een miljoen keer bellen met Nashornduurt 7,5~7,8 seconden

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

org.jsonduurt 20~21 seconden

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

Jacksonduurt 6,5~7 seconden

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

In dit geval presteert Jackson beter dan Nashorn, die veel beter presteert dan org.json.
Nashorn API is moeilijker te gebruiken dan die van org.json of Jackson. Afhankelijk van uw vereisten kunnen Jackson en Nashorn beide haalbare oplossingen zijn.


Antwoord 11, autoriteit 3%

Ik denk dat het de beste manier is om de officiële Java JSON APIte gebruiken, die er wordt nog aan gewerkt.


Antwoord 12, autoriteit 2%

Ik stond versteld van hoe gemakkelijk het was. Je kunt gewoon een Stringmet je JSON doorgeven aan de constructor van een JSONObject in het standaard org.json-pakket.

JSONArray rootOfPage =  new JSONArray(JSONString);

Gereed. Laat microfoon vallen.
Dit werkt ook met JSONObjects. Daarna kunt u gewoon door uw hiërarchie van Objectskijken met behulp van de get()-methoden op uw objecten.


Antwoord 13, autoriteit 2%

Er zijn veel JSON-bibliotheken beschikbaar in Java.

De meest beruchte zijn: Jackson, GSON, Genson, FastJson en org.json.

Er zijn doorgaans drie dingen waar u op moet letten bij het kiezen van een bibliotheek:

  1. Prestaties
  2. Gebruiksgemak (code is eenvoudig te schrijven en leesbaar) – dat hoort bij functies.
  3. Voor mobiele apps: afhankelijkheid/potgrootte

Specifiek voor JSON-bibliotheken (en alle bibliotheken voor serialisatie/deserialisatie), is databinding meestal ook van belang omdat het de noodzaak wegneemt om boilerplate-code te schrijven om de gegevens in of uit te pakken.

Voor 1, zie deze benchmark: https://github.com/fabienrenaud/java-json -benchmarkik deed met behulp van JMHdie vergelijkt (jackson, gson , genson, fastjson, org.json, jsonp) prestaties van serializers en deserializers met behulp van stream- en databind-API’s.
Voor 2 vindt u tal van voorbeelden op internet. De bovenstaande benchmark kan ook worden gebruikt als een bron van voorbeelden…

Snel overzicht van de benchmark: Jacksonpresteert 5 tot 6 keer beter dan org.json en meer dan twee keer beter dan GSON.

Voor uw specifieke voorbeeld decodeert de volgende code uw json met 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.
    }
}

Laat het me weten als je vragen hebt.


Antwoord 14

Naast andere antwoorden raad ik deze online opensource-service jsonschema2pojo.orgaan voor het snel genereren van Java-klassen van json of json-schema voor GSON, Jackson 1.x of Jackson 2.x. Als u bijvoorbeeld het volgende heeft:

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

De jsonschema2pojo.orgvoor GSON gegenereerd:

@Generated("org.jsonschema2pojo")
public class Container {
    @SerializedName("pageInfo")
    @Expose
    public PageInfo pageInfo;
    @SerializedName("posts")
    @Expose
    public List<Post> posts = new ArrayList<Post>();
}
@Generated("org.jsonschema2pojo")
public class PageInfo {
    @SerializedName("pageName")
    @Expose
    public String pageName;
    @SerializedName("pagePic")
    @Expose
    public String pagePic;
}
@Generated("org.jsonschema2pojo")
public class Post {
    @SerializedName("post_id")
    @Expose
    public String postId;
    @SerializedName("actor_id")
    @Expose
    public long actorId;
    @SerializedName("picOfPersonWhoPosted")
    @Expose
    public String picOfPersonWhoPosted;
    @SerializedName("nameOfPersonWhoPosted")
    @Expose
    public String nameOfPersonWhoPosted;
    @SerializedName("message")
    @Expose
    public String message;
    @SerializedName("likesCount")
    @Expose
    public long likesCount;
    @SerializedName("comments")
    @Expose
    public List<Object> comments = new ArrayList<Object>();
    @SerializedName("timeOfPost")
    @Expose
    public long timeOfPost;
}

Antwoord 15

Als je een Java-klasse (zeg Message) hebt die de JSON-tekenreeks (jsonString) vertegenwoordigt, kun je JacksonJSON-bibliotheek met:

Message message= new ObjectMapper().readValue(jsonString, Message.class);

en van het berichtobject kun je elk van zijn attributen ophalen.


Antwoord 16

Gsonis gemakkelijk te leren en te implementeren, wat we moeten weten zijn de volgende twee methoden

  • toJson()– Converteer Java-object naar JSON-formaat

  • fromJson()– Converteer JSON naar Java-object

`

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import com.google.gson.Gson;
public class GsonExample {
    public static void main(String[] args) {
    Gson gson = new Gson();
    try {
        BufferedReader br = new BufferedReader(
            new FileReader("c:\\file.json"));
        //convert the json string back to object
        DataObject obj = gson.fromJson(br, DataObject.class);
        System.out.println(obj);
    } catch (IOException e) {
        e.printStackTrace();
    }
    }
}

`


Antwoord 17

Er zijn veel open source-bibliotheken aanwezig om JSON-inhoud naar een object te parseren of alleen om JSON-waarden te lezen. Uw vereiste is alleen om waarden te lezen en deze te parseren naar een aangepast object. Dus de bibliotheek org.json is in jouw geval voldoende.

Gebruik de org.json-bibliotheek om het te ontleden en JsonObject te maken:

JSONObject jsonObj = new JSONObject(<jsonStr>);

Gebruik nu dit object om uw waarden op te halen:

String id = jsonObj.getString("pageInfo");

Je kunt hier een compleet voorbeeld zien:

JSON ontleden in Java


Antwoord 18

Lees de volgende blogpost, JSON in Java.

Dit bericht is een beetje oud, maar toch wil ik je vraag beantwoorden.

Stap 1: Maak een POJO-klasse van uw gegevens.

Stap 2: Maak nu een object met JSON.

Employee employee = null;
ObjectMapper mapper = new ObjectMapper();
try {
    employee =  mapper.readValue(newFile("/home/sumit/employee.json"), Employee.class);
} 
catch(JsonGenerationException e) {
    e.printStackTrace();
}

Voor meer informatie kunt u de volgende link.


Antwoord 19

Je kunt de Gson-bibliotheek gebruiken om de JSON-tekenreeks te ontleden.

Gson gson = new Gson();
JsonObject jsonObject = gson.fromJson(jsonAsString, JsonObject.class);
String pageName = jsonObject.getAsJsonObject("pageInfo").get("pageName").getAsString();
String pagePic = jsonObject.getAsJsonObject("pageInfo").get("pagePic").getAsString();
String postId = jsonObject.getAsJsonArray("posts").get(0).getAsJsonObject().get("post_id").getAsString();

Je kunt ook als volgt door de array “posts” lopen:

JsonArray posts = jsonObject.getAsJsonArray("posts");
for (JsonElement post : posts) {
  String postId = post.getAsJsonObject().get("post_id").getAsString();
  //do something
}

Antwoord 20

Doe alsjeblieft zoiets als dit:

JSONParser jsonParser = new JSONParser();
JSONObject obj = (JSONObject) jsonParser.parse(contentString);
String product = (String) jsonObject.get("productId");

Antwoord 21

{
   "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"
         }
    ]
}
Java code :
JSONObject obj = new JSONObject(responsejsonobj);
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");
    ......etc
}

22

Je kunt Jayway JsonPathgebruiken. Hieronder staat een GitHub-link met broncode, pom-details en goede documentatie.

https://github.com/jayway/JsonPath

Volg de onderstaande stappen.

Stap 1: voeg de jayway JSON-padafhankelijkheid toe aan uw klaspad met Maven of download het JAR-bestand en voeg het handmatig toe.

<dependency>
            <groupId>com.jayway.jsonpath</groupId>
            <artifactId>json-path</artifactId>
            <version>2.2.0</version>
</dependency>

Stap 2: sla uw invoer-JSON op als een bestand voor dit voorbeeld. In mijn geval heb ik je JSON opgeslagen als sampleJson.txt. Merk op dat je een komma hebt gemist tussen pageInfo en berichten.

Stap 3: lees de JSON-inhoud uit het bovenstaande bestand met bufferedReader en sla het op als String.

BufferedReader br = new BufferedReader(new FileReader("D:\\sampleJson.txt"));
StringBuilder sb = new StringBuilder();
String line = br.readLine();
while (line != null) {
    sb.append(line);
    sb.append(System.lineSeparator());
    line = br.readLine();
}
br.close();
String jsonInput = sb.toString();

Stap 4: ontleden uw JSON-tekenreeks met behulp van jayway JSON-parser.

Object document = Configuration.defaultConfiguration().jsonProvider().parse(jsonInput);

Stap 5: lees de details zoals hieronder.

String pageName = JsonPath.read(document, "$.pageInfo.pageName");
String pagePic = JsonPath.read(document, "$.pageInfo.pagePic");
String post_id = JsonPath.read(document, "$.posts[0].post_id");
System.out.println("$.pageInfo.pageName " + pageName);
System.out.println("$.pageInfo.pagePic " + pagePic);
System.out.println("$.posts[0].post_id " + post_id);

De uitvoer zal zijn:

$.pageInfo.pageName = abc
$.pageInfo.pagePic = http://example.com/content.jpg
$.posts[0].post_id  = 123456789012_123456789012

Antwoord 23

De beste antwoorden op deze pagina gebruiken te simpele voorbeelden, zoals een object met één eigenschap (bijv. {name: value}). Ik denk dat dat nog steeds eenvoudige maar levensechte voorbeeld iemand kan helpen.

Dit is dus de JSON die wordt geretourneerd door de Google Translate API:

{
  "data": 
     {
        "translations": 
          [
            {
              "translatedText": "Arbeit"
             }
          ]
     }
}

Ik wil de waarde van het kenmerk “translatedText” ophalen, b.v. “Arbeit” met Gson van Google.

Twee mogelijke benaderingen:

  1. Haal slechts één nodig attribuut op

    String json  = callToTranslateApi("work", "de");
     JsonObject jsonObject = new JsonParser().parse(json).getAsJsonObject();
     return jsonObject.get("data").getAsJsonObject()
             .get("translations").getAsJsonArray()
             .get(0).getAsJsonObject()
             .get("translatedText").getAsString();
    
  2. Java-object maken van JSON

    class ApiResponse {
         Data data;      
         class Data {
             Translation[] translations;         
             class Translation {
                 String translatedText;
             }
          }
      }
    

     Gson g = new Gson();
      String json =callToTranslateApi("work", "de");
      ApiResponse response = g.fromJson(json, ApiResponse.class);
      return response.data.translations[0].translatedText;
    

Antwoord 24

Ik heb JSON als volgt:

{
   "pageInfo": {
         "pageName": "abc",
         "pagePic": "http://example.com/content.jpg"
    }
}

Java-klasse

class PageInfo {
    private String pageName;
    private String pagePic;
    // Getters and setters
}

Code voor het converteren van deze JSON naar een Java-klasse.

   PageInfo pageInfo = JsonPath.parse(jsonString).read("$.pageInfo", PageInfo.class);

Maven

<dependency>
    <groupId>com.jayway.jsonpath</groupId>
    <artifactId>json-path</artifactId>
    <version>2.2.0</version>
</dependency>

Antwoord 25

Als je een maven-project hebt, voeg dan onderstaande afhankelijkheid toe of normaal project voeg json-simple jar toe.

<dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20180813</version>
</dependency>

Schrijf hieronder java-code voor het converteren van JSON-tekenreeks naar JSON-array.

JSONArray ja = new JSONArray(String jsonString);

Antwoord 26

Men kan Apache @Model-annotatiegebruiken om Javamodelklassen die de structuur van JSON-bestanden vertegenwoordigen en deze gebruiken om toegang te krijgen tot verschillende elementen in de JSON-structuur. In tegenstelling tot andere oplossingen werkt deze volledig zonder reflectieen is dus geschikt voor omgevingen waar reflectie onmogelijk is of gepaard gaat met aanzienlijke overhead.

Er is een voorbeeld Maven-projecttoont het gebruik. Allereerst definieert het de structuur:

@Model(className="RepositoryInfo", properties = {
    @Property(name = "id", type = int.class),
    @Property(name = "name", type = String.class),
    @Property(name = "owner", type = Owner.class),
    @Property(name = "private", type = boolean.class),
})
final class RepositoryCntrl {
    @Model(className = "Owner", properties = {
        @Property(name = "login", type = String.class)
    })
    static final class OwnerCntrl {
    }
}

en dan gebruikt het de gegenereerde klassen RepositoryInfo en Owner om de geleverde invoerstroom te ontleden en daarbij bepaalde informatie op te halen:

List<RepositoryInfo> repositories = new ArrayList<>();
try (InputStream is = initializeStream(args)) {
    Models.parse(CONTEXT, RepositoryInfo.class, is, repositories);
}
System.err.println("there is " + repositories.size() + " repositories");
repositories.stream().filter((repo) -> repo != null).forEach((repo) -> {
    System.err.println("repository " + repo.getName() + 
        " is owned by " + repo.getOwner().getLogin()
    );
})

Dat is het! Daarnaast is hier een live-gist weergegeven: vergelijkbaar voorbeeld samen met asynchrone netwerkcommunicatie.


27

U kunt JsonNodegebruiken voor een gestructureerde boomrepresentatie van uw JSON-string. Het maakt deel uit van de Rock Solid jackson bibliotheek die alomtegenwoordig is.

ObjectMapper mapper = new ObjectMapper();
JsonNode yourObj = mapper.readTree("{\"k\":\"v\"}");

28

We kunnen de JSONOBJECT-klasse gebruiken om een ​​JSON-string naar een JSON-object te converteren,
en om over het JSON-object te herhalen. Gebruik de volgende code.

JSONObject jObj = new JSONObject(contents.trim());
Iterator<?> keys = jObj.keys();
while( keys.hasNext() ) {
  String key = (String)keys.next();
  if ( jObj.get(key) instanceof JSONObject ) {           
    System.out.println(jObj.getString(String key));
  }
}

Other episodes