วิธีแยก JSON ใน Java


1048

ฉันมีข้อความ JSON ต่อไปนี้ ฉันจะแยกให้ได้รับค่าของpageName, pagePic, post_idฯลฯ ?

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

7
java สร้างขึ้นในไลบรารี JSON เป็นวิธีที่รวดเร็วในการทำเช่นนั้น แต่ในประสบการณ์ของฉัน GSON เป็นห้องสมุดที่ดีที่สุดสำหรับการแยกวิเคราะห์ JSON เป็น POJO อย่างไม่ลำบาก
Iman Akbari

16
นี่เป็นคำถามแรกที่ได้รับการโหวตอย่างสูงและได้รับการป้องกันซึ่งคำตอบที่ฉันพบว่าสับสนมากที่สุด
Riyafa Abdul Hameed

6
@JaysonMinard เห็นด้วย ถามหาการแทรกแซงของ mod สิ่งนี้ควรปิดจริง ๆ ฉันเริ่มสันนิษฐาน (ผิด) ฉันไม่สามารถทำได้ในขณะที่คำถามได้รับการปกป้องดังนั้นฉันไม่มีการป้องกันและทำสิ่งที่ฉัน ได้รับการปกป้องอีกครั้งในขณะนี้เพื่อป้องกันไม่ให้คำตอบต่ำและเช่นในขณะที่รอ mod
Mena

4
"คำถามนี้ไม่ได้แสดงความพยายามในการวิจัยใด ๆ " - คำแนะนำเครื่องมือปุ่มลง
Jean-François Corbett

6
คำถามนี้จะถูกกล่าวถึงใน Meta
Mark Amery

คำตอบ:


753

org.jsonห้องสมุดง่ายต่อการใช้งาน รหัสตัวอย่างด้านล่าง:

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");
for (int i = 0; i < arr.length(); i++)
{
    String post_id = arr.getJSONObject(i).getString("post_id");
    ......
}

คุณอาจพบตัวอย่างเพิ่มเติมจาก: Parse JSON ใน Java

jar ที่ดาวน์โหลดได้: http://mvnrepository.com/artifact/org.json/json


15
ฉันเห็นด้วยกับ @StaxMan ฉันเพิ่งลอง org.json และมันยุ่งยากอย่างมาก มันไม่ได้เล่นกับประเภท Java Collection มาตรฐานจริง ๆ
Ken Williams

7
@StaxMan ฉันจะเลือกorg.jsonไลบรารีอื่น ๆ สำหรับการวิเคราะห์ JSON แบบง่ายโดยไม่ต้องดู มันเป็นห้องสมุดอ้างอิงที่ Douglas Crockford (ผู้ค้นพบ JSON) สร้างขึ้น
Omar Al-Ithawi

31
@OmarIthawi นั่นมันช่างงี่เง่า มันเป็นข้อพิสูจน์แนวคิดด้วย awkward API การใช้งานที่ไม่มีประสิทธิภาพ ฉันคิดว่ามันเป็นการดีกว่าที่จะพิจารณาห้องสมุดด้วยความดีงามของตนเองแทนที่จะพยายามลดคุณภาพจากการมองเห็นของผู้แต่ง - ดั๊กประสบความสำเร็จในหลาย ๆ อย่าง แต่นั่นไม่ได้เปลี่ยนคุณภาพของ lib โดยเฉพาะ 10 ปีที่แล้วเป็นเกมเดียวในเมือง แต่หลังจากนั้นก็มีความคืบหน้าในเชิงบวกอย่างมาก มันเหมือนกับ Struts of json libs
StaxMan

12
org.json เป็นหนึ่งในห้องสมุด json ที่เลวร้ายที่สุด หนึ่งควรดูที่ชุดคุณสมบัติและประสิทธิภาพของห้องสมุด json ที่มีอยู่ก่อนที่จะเลือก นี่คือมาตรฐานผมไม่เปรียบเทียบ Jackson, gson, org.json, Genson ใช้ JMH: github.com/fabienrenaud/java-json-benchmark แจ็คสันเป็นผู้ชนะที่ชัดเจนที่นี่
fabien

4
ใบอนุญาตไม่รวมถึงการออกใบอนุญาตโอเพนซอร์ซที่ใช้กันทั่วไปและยังมีลิขสิทธิ์
Christian Vielma

536

เพื่อประโยชน์ของตัวอย่างที่ช่วยให้ถือว่าคุณมีชั้นเรียนที่มีเพียงPersonname

private class Person {
    public String name;

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

Google GSON ( Maven )

รายการโปรดส่วนตัวของฉันเกี่ยวกับการทำให้เป็นอันดับของ JSON ที่ดี / การยกเลิกการทำให้เป็นวัตถุ

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

ปรับปรุง

หากคุณต้องการรับคุณลักษณะเดียวคุณสามารถทำได้อย่างง่ายดายด้วยห้องสมุด Google เช่นกัน:

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

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

องค์กร JSON ( Maven )

หากคุณไม่ต้องการการลดออบเจ็กต์วัตถุ แต่เพียงรับแอตทริบิวต์คุณสามารถลอง org.json ( หรือดูตัวอย่าง GSON ด้านบน! )

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

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

แจ็กสัน ( Maven )

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

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

16
คำตอบที่ดี. หนึ่งข้อเสนอแนะสำหรับการปรับปรุงเล็กน้อย: ทั้ง GSON และ Jackson ยังสนับสนุนการใช้การแทนทรี JSON (สำหรับ Jackson เหล่านี้คือJsonNodes GSON มีบางอย่างที่คล้ายกัน) อาจเป็นการดีที่จะแสดงตัวอย่างเนื่องจากเป็นวิธีเดียวกับที่ org.json เสนอทางเดียว
StaxMan

สองห้องสมุดอื่น ๆ ที่ควรค่าแก่การกล่าวถึง (เพื่อประโยชน์ของความครบถ้วนสมบูรณ์): json-simpleและJSONP ของ Oracle
jake stayman

3
@NeonWarge ทำไม สำหรับฉันดูเหมือนว่าคำตอบนี้ถือว่าหนึ่งได้กำหนดคลาส Java ที่มีเขตข้อมูลเดียวกับสตริง JSON ว่าไม่มีอะไรน้อยและไม่มีอะไรเพิ่มเติม นี่เป็นข้อสมมติฐานที่ค่อนข้างแข็งแกร่ง
Andrea Lazzarotto

1
json-simple และ orson's jsonp ทำงานได้อย่างยอดเยี่ยม: github.com/fabienrenaud/java-json-benchmarkเพื่อประสิทธิภาพการทำงานให้เลือกแจ็คสันหรือ dsljson
fabien

GSON ไม่รองรับการกรองฟิลด์แบบไดนามิกในระดับอื่นที่ไม่ใช่รูท!
Gangnus

102
  1. หากต้องการสร้างวัตถุ Java จาก JSON และในทางกลับกันใช้ GSON หรือ JACKSON ไหบุคคลที่สามเป็นต้น

    //from object to JSON 
    Gson gson = new Gson();
    gson.toJson(yourObject);
    
    // from JSON to object 
    yourObject o = gson.fromJson(JSONString,yourObject.class);
    
  2. แต่ถ้าต้องการแยกสตริง JSON และรับค่าบางอย่าง (หรือสร้างสตริง JSON ตั้งแต่เริ่มต้นเพื่อส่งสาย) เพียงแค่ใช้ JaveEE jar ซึ่งมี JsonReader, JsonArray, JsonObject เป็นต้นคุณอาจต้องการดาวน์โหลดการใช้งานนั้น spec เช่น javax.json ด้วยไหทั้งสองนี้ฉันสามารถแจง json และใช้ค่าต่างๆ

    API เหล่านี้เป็นไปตามรูปแบบการแยกวิเคราะห์ DOM / SAX จริงของ 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");
    

4
@nondescript ถ้าฉันต้องเดาฉันจะบอกว่ามัน downvoted เพราะมันไม่ได้ตอบคำถามของผู้โพสต์ดั้งเดิม: "รหัสที่จำเป็นคืออะไร?" คำตอบที่ได้รับการสนับสนุนตัวอย่างโค้ดที่ upvoted
jewbix.cube

4
หมายเหตุ: แจ็คสันและ GSON รองรับทั้งแผนผังแบบต้นไม้และ / หรือแผนที่ / ลิสต์ดังนั้นจึงไม่จำเป็นต้องใช้แพ็คเกจ Java EE (javax.json) javax.json มีข้อเสนอเล็กน้อยเกินกว่าแจ็คสันหรือ GSON
StaxMan

ฉันแนะนำให้เพิ่มลิงค์ไปยังไลบรารี JavaEE
Basil Bourque

72

ตัวแยกวิเคราะห์อย่างรวดเร็ว jsonนั้นตรงไปตรงมายืดหยุ่นอย่างรวดเร็วและปรับแต่งได้ ลองมัน

คุณสมบัติ:

  • สอดคล้องกับข้อกำหนด JSON (RFC4627)
  • ตัวแยกวิเคราะห์ JSON ประสิทธิภาพสูง
  • รองรับวิธีการแยกวิเคราะห์แบบยืดหยุ่น / กำหนดค่าได้
  • การตรวจสอบความถูกต้องที่กำหนดของคู่คีย์ / ค่าของลำดับชั้น JSON ใด ๆ
  • ใช้งานง่าย # ใช้พื้นที่น้อยมาก
  • ยกระดับผู้พัฒนาให้เป็นมิตรและง่ายต่อการติดตามข้อยกเว้น
  • การสนับสนุนการตรวจสอบความถูกต้องที่กำหนดเองได้ Pluggable - คีย์ / ค่าสามารถตรวจสอบได้โดยการกำหนดค่าตัวตรวจสอบความถูกต้องที่กำหนดเองเมื่อและเมื่อพบ
  • การสนับสนุนการตรวจสอบความถูกต้องและการแยกวิเคราะห์ parser
  • สนับสนุนการกำหนดค่าสองประเภท (JSON / XML) สำหรับการใช้ตัวแยกวิเคราะห์ที่ตรวจสอบได้อย่างรวดเร็ว JSON
  • ต้องการ JDK 1.5
  • ไม่มีการพึ่งพาไลบรารีภายนอก
  • สนับสนุนการสร้าง JSON ผ่านการทำให้เป็นอันดับวัตถุ
  • สนับสนุนการเลือกประเภทของคอลเลกชันในระหว่างกระบวนการแยกวิเคราะห์

มันสามารถใช้เช่นนี้:

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

3
มี javadoc ให้บริการไหม?
jboi

24
แพ็กเกจนี้ไม่สามารถจัดการค่าว่างเมื่อวิเคราะห์คำ ตัวอย่างเช่น: ... "description": "" ... ส่งข้อยกเว้น
Ivan

6
ฉันได้แก้ไขปัญหานี้แล้ว (และอื่น ๆ อีกมากมาย) ในcode.google.com/p/quick-json/issues/detail?id=11 ฉันหวังว่าผู้เขียนจะให้เวลาในการแก้ไขในการเปิดตัวอย่างเป็นทางการ
noamik

8
คุณสมบัติที่ปรากฏไม่มีอะไรพิเศษเมื่อเทียบกับตัวเลือกอื่น - และการอ้างสิทธิ์ประสิทธิภาพสูงไม่ได้รับการสนับสนุนจากสิ่งใด ซึ่งแตกต่างจากผู้ใหญ่มากขึ้นสำหรับห้องสมุด (Gson แจ็คสัน Genson บุญ) ซึ่งรวมอยู่ในเกณฑ์มาตรฐานเช่นgithub.com/eishay/jvm-serializers , github.com/novoj/JavaJsonPerformanceTestหรือdeveloper.com/lang/jscript/... - ฉัน ไม่เคยเห็นห้องสมุดนี้รวมอยู่ในการทดสอบหรือกล่าวถึงการใช้อย่างกว้างขวาง
StaxMan

26
โปรเจ็กต์นี้ดูเหมือนจะตายแล้วและดูเหมือนจะไม่โฮสต์ในที่เก็บ Maven กลางอีกต่อไป
8bitjunkie

40

คุณสามารถใช้Google Gson

การใช้ไลบรารีนี้คุณจะต้องสร้างแบบจำลองที่มีโครงสร้าง JSON เดียวกัน จากนั้นโมเดลจะถูกเติมโดยอัตโนมัติคุณต้องเรียกตัวแปรของคุณเป็นคีย์ JSON ของคุณหรือใช้@SerializedNameถ้าคุณต้องการใช้ชื่ออื่น

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

แบบ

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

วจีวิภาค

ตอนนี้คุณสามารถแยกวิเคราะห์โดยใช้ห้องสมุด Gson:

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

นำเข้า Gradle

อย่าลืมนำเข้าไลบรารีในไฟล์ Gradle ของแอป

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

การสร้างแบบจำลองอัตโนมัติ

คุณสามารถสร้างโมเดลจาก JSON โดยอัตโนมัติโดยใช้เครื่องมือออนไลน์เช่นนี้


38

คำตอบที่ให้เกือบทั้งหมดต้องใช้การดีซีเรียลไลเซชันแบบเต็มของ JSON ลงในวัตถุ Java ก่อนที่จะเข้าถึงค่าในคุณสมบัติที่น่าสนใจ อีกทางเลือกหนึ่งที่ไม่ได้ไปในเส้นทางนี้คือการใช้JsonPATHซึ่งเหมือนกับ XPath สำหรับ JSON และอนุญาตการแวะผ่านวัตถุ JSON

มันเป็นสเปคและผู้คนที่ดีที่ JayWay ได้สร้างการใช้งานจาวาสำหรับสเปคที่คุณสามารถหาได้ที่นี่: https://github.com/jayway/JsonPath

ดังนั้นโดยพื้นฐานแล้วให้ใช้เพิ่มเข้าไปในโครงการของคุณเช่น:

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

และที่จะใช้:

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

ฯลฯ ...

ตรวจสอบหน้าข้อมูลจำเพาะ JsonPath สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีอื่นในการข้าม JSON


นี่เป็นห้องสมุดที่ดีมากโดยเฉพาะอย่างยิ่งสำหรับการอ่านและอัปเดต JSON แต่ระวังปัญหาที่ทราบเกี่ยวกับไลบรารีนี้ ดู [1]: github.com/json-path/JsonPath/issues/272 [2]: github.com/json-path/JsonPath/issues/375
papigee

38

เอ - คำอธิบาย

คุณสามารถใช้ห้องสมุดJacksonสำหรับการผูก JSON String ลงในอินสแตนซ์POJO ( วัตถุ Java เก่าธรรมดา ) POJO เป็นเพียงคลาสที่มีฟิลด์ส่วนตัวและเมธอด getter / setter สาธารณะเท่านั้น แจ็กสันกำลังสำรวจวิธี (โดยใช้การสะท้อน ) และแมปวัตถุ JSON ลงในอินสแตนซ์ POJO เนื่องจากชื่อฟิลด์ของคลาสตรงกับชื่อฟิลด์ของวัตถุ JSON

ในวัตถุ JSON ของคุณซึ่งจริง ๆ แล้วเป็นวัตถุประกอบวัตถุหลักประกอบด้วยวัตถุย่อยสองรายการ ดังนั้นคลาส POJO ของเราควรมีลำดับชั้นเดียวกัน ฉันจะเรียกวัตถุ JSON ทั้งหมดเป็นวัตถุหน้า หน้าวัตถุประกอบด้วยPageInfoวัตถุและโพสต์อาร์เรย์วัตถุ

ดังนั้นเราต้องสร้างคลาส POJO ที่แตกต่างกันสามคลาส

  • Page Class ประกอบไปด้วยPageInfo Class และอาร์เรย์ของPost Instances
  • คลาสPageInfo
  • ชั้นเรียนโพสต์

แพ็คเกจเดียวที่ฉันใช้คือ Jackson ObjectMapper สิ่งที่เราทำคือการผูกข้อมูล

com.fasterxml.jackson.databind.ObjectMapper

การอ้างอิงที่ต้องการไฟล์ jar แสดงอยู่ด้านล่าง

  • jackson-core-2.5.1.jar
  • แจ็คสัน DataBind-2.5.1.jar
  • แจ็คสันคำอธิบายประกอบ-2.5.0.jar

นี่คือรหัสที่จำเป็น

B - คลาส POJO หลัก: หน้า

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: 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: โพสต์

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 - ตัวอย่างไฟล์ JSON: sampleJSONFile.json

ฉันเพิ่งคัดลอกตัวอย่าง 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"
         }
    ]
}

F - รหัสการสาธิต

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 - เอาท์พุทสาธิต

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

26

ใช้minimal-jsonซึ่งรวดเร็วและใช้งานง่าย คุณสามารถแยกวิเคราะห์จาก String obj และ Stream

ข้อมูลตัวอย่าง:

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

แยก:

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

สร้าง JSON:

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>

pojo จะมีลักษณะอย่างไร
Jesse

สำหรับ Pojo ใช้ gson ห้องสมุดนี้ไม่รองรับ
Sakib Sami

22

ฉันเชื่อว่าแนวทางปฏิบัติที่ดีที่สุดคือการใช้Java JSON APIอย่างเป็นทางการซึ่งยังอยู่ในระหว่างดำเนินการ


7
ตั้งแต่ฉันตอบกลับฉันเริ่มใช้Jacksonและฉันคิดว่าเป็นหนึ่งในห้องสมุดที่ดีที่สุดสำหรับ JSON de-serialization
Giovanni Botta

2
เหตุใดพวกเขาใช้ JSONP ซ้ำเพื่อให้ความหมายต่างจากJSON ด้วย Padding อีกครั้ง ...
Chris Wesseling

@ChrisWesseling คุณหมายถึงอะไร
Giovanni Botta

"Java API สำหรับการประมวลผล JSON (JSON-P)" เป็นชื่อของเอกสารที่คุณลิงก์ และมันทำให้ฉันสับสนเพราะฉันรู้ว่า JSONP หมายถึงอย่างอื่น
Chris Wesseling

1
@ ChrisWesseling โอ้ที่สับสน นั่นคือสิ่งที่พวกเขาเลือกสำหรับสเปค อย่างไรก็ตามอย่างที่ฉันพูดฉันจะไปที่แจ็คสัน
Giovanni Botta

22

เนื่องจากยังไม่มีใครพูดถึงนี่คือจุดเริ่มต้นของการแก้ปัญหาโดยใช้Nashorn (ส่วนรันไทม์ JavaScript ของ Java 8 แต่เลิกใช้แล้วใน Java 11)

สารละลาย

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

การเปรียบเทียบประสิทธิภาพ

ฉันเขียนเนื้อหา JSON ที่มีสามอาร์เรย์ตามลำดับ 20, 20 และ 100 องค์ประกอบ ฉันแค่ต้องการรับ 100 องค์ประกอบจากอาร์เรย์ที่สาม ฉันใช้ฟังก์ชัน JavaScript ต่อไปนี้เพื่อวิเคราะห์และรับข้อมูลของฉัน

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

ใช้สายล้านครั้งโดยใช้Nashornใช้เวลา 7.5 ~ 7.8 วินาที

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

org.jsonใช้เวลา 20 ~ 21 วินาที

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

แจ็คสันใช้เวลา 6.5 ~ 7 วินาที

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

ในกรณีนี้แจ็คสันทำงานได้ดีกว่าแนชซึ่งทำได้ดีกว่า org.json มาก Nashorn API นั้นยากต่อการใช้งานมากกว่า org.json's หรือ Jackson's ขึ้นอยู่กับความต้องการของคุณแจ็คสันและ Nashorn ทั้งคู่สามารถเป็นโซลูชั่นที่ทำงานได้


1
หน่วย " "" คืออะไร ไม่ใช่นิ้วใช่ไหม มันคือไม่กี่วินาที? นาที?
Peter Mortensen

1
@PeterMortensen หมายถึงวินาที เนื่องจากดูเหมือนว่าไม่ชัดเจนฉันจะเปลี่ยนมัน ขอบคุณสำหรับความคิดเห็น
otonglet

2
แต่น่าเสียดายที่ Nashorn จะเลิกในชวา 11. JEP 335
ต่อ Mildner

1
ฉันรู้ว่า Nashorn เลิกใช้แล้ว แต่ฉันชอบคำตอบนี้เพราะฉันไม่ต้องการการพึ่งพาใด ๆ อย่างไรก็ตามฉันต้องทำงานตัวอย่างอีกเล็กน้อย:ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript"); engine.eval("var fun = function(raw) { return JSON.parse(raw); };"); Map<String, Object> json = (Map<String, Object>) ((Invocable) engine).invokeFunction("fun", jsonString);
kgibm

21

ตัวอย่างด้านล่างแสดงวิธีอ่านข้อความในคำถามซึ่งแสดงเป็นตัวแปร "jsonText" โซลูชันนี้ใช้ Java EE7 javax.json API (ซึ่งกล่าวถึงในคำตอบอื่น ๆ ) เหตุผลที่ผมได้เพิ่มก็เป็นคำตอบที่แยกต่างหากคือว่าการแสดงรหัสต่อไปนี้วิธีการจริงเข้าถึงบางส่วนของค่าที่แสดงในคำถาม การใช้งาน javax.json APIจะต้องทำให้รหัสนี้ทำงาน แพคเกจเต็มรูปแบบสำหรับแต่ละชั้นเรียนที่จำเป็นรวมอยู่ในขณะที่ฉันไม่ต้องการประกาศคำสั่ง "นำเข้า"

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

ตอนนี้ก่อนใครจะไปลงคะแนนคำตอบนี้เพราะมันไม่ได้ใช้ GSON, org.json, Jackson หรือกรอบงานของบุคคลที่สามอื่น ๆ ที่มีอยู่มันเป็นตัวอย่างของ "รหัสที่จำเป็น" ต่อคำถามเพื่อแยกวิเคราะห์ข้อความที่ให้ไว้ ฉันตระหนักดีว่าการยึดมั่นกับมาตรฐาน JSR 353 ปัจจุบันไม่ได้รับการพิจารณาสำหรับ JDK 9และเป็นเช่นนั้นข้อมูลจำเพาะ JSR 353ควรได้รับการปฏิบัติเช่นเดียวกับการดำเนินการจัดการ JSON บุคคลที่สามอื่น ๆ


15

มันทำให้ฉันคิดว่ามันง่ายแค่ไหน คุณสามารถผ่านการStringระงับ JSON ของคุณไปยังตัวสร้างของ JSONObject ในแพ็คเกจ org.json เริ่มต้น

JSONArray rootOfPage =  new JSONArray(JSONString);

เสร็จสิ้น Drops ไมโครโฟน ใช้งานได้JSONObjectsดีเช่นกัน หลังจากนั้นคุณสามารถดูลำดับชั้นของการObjectsใช้get()วิธีการกับวัตถุของคุณ


13
JSONArrayประเภทไม่ได้เป็นส่วนหนึ่งของ J2SE JDK API และคุณไม่ได้บอกว่าเป็นที่ API หรือไลบรารีของบุคคลที่สามให้ประเภทนี้
Bobulous

2
ไม่ว่าฉันจะแนะนำให้ใช้มัน แต่ฉันคิดว่านี้หมายถึง "org.json" แพคเกจจากjson.org/java มันเคยถูกใช้ก่อนที่จะมีห้องสมุด Java ที่ดี แต่นี่เป็นปีที่ผ่านมา (2008 หรือก่อนหน้า)
StaxMan

1
หรือ brainmurphy1 หมายถึงJSONArrayใน Android หรือไม่
Alexander Farber

12

มีไลบรารี JSON จำนวนมากที่มีใน Java

สิ่งที่มีชื่อเสียงที่สุดคือ: แจ็กสัน, GSON, Genson, FastJson และ org.json

โดยทั่วไปมีสามสิ่งที่เราควรพิจารณาในการเลือกไลบรารีใด ๆ :

  1. ประสิทธิภาพ
  2. ใช้งานง่าย (รหัสง่ายต่อการเขียนและอ่านง่าย) - ไปพร้อมกับคุณสมบัติ
  3. สำหรับแอพมือถือ: ขนาดพึ่งพา / ขวด

โดยเฉพาะสำหรับไลบรารี JSON (และการทำให้เป็นอนุกรม / deserialization libs), ฐานข้อมูลก็มักจะเป็นที่น่าสนใจเพราะมันไม่จำเป็นต้องเขียนรหัสแผ่นจานหม้อไอน้ำเพื่อแพ็ค / แกะข้อมูล

สำหรับ 1 ดูเกณฑ์มาตรฐานนี้: https://github.com/fabienrenaud/java-json-benchmarkฉันใช้JMHซึ่งเปรียบเทียบ (แจ็คสัน, gson, genson, fastjson, org.json, jsonp) ของ serializers และ deserializers โดยใช้ stream และ databind API สำหรับ 2 คุณสามารถค้นหาตัวอย่างมากมายบนอินเทอร์เน็ต เกณฑ์มาตรฐานข้างต้นสามารถใช้เป็นตัวอย่างของ ...

เกณฑ์มาตรฐานอย่างรวดเร็ว: แจ็คสันทำงานได้ดีกว่า org.json 5 ถึง 6 เท่าและดีกว่า GSON มากกว่าสองเท่า

สำหรับตัวอย่างเฉพาะของคุณรหัสต่อไปนี้จะถอดรหัส json ของคุณด้วย 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.
    }
}

แจ้งให้เราทราบหากคุณมีคำถามใด ๆ


11

นอกจากคำตอบอื่น ๆ ฉันขอแนะนำบริการ opensource ออนไลน์นี้jsonschema2pojo.orgสำหรับการสร้างคลาส Java อย่างรวดเร็วจาก json หรือ json schema สำหรับ GSON, Jackson 1.x หรือ Jackson 2.x ตัวอย่างเช่นถ้าคุณมี:

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

jsonschema2pojo.orgสำหรับ GSON สร้าง:

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

9

หากคุณมีคลาส Java (พูดข้อความ) ที่แสดงถึงสตริง JSON (jsonString) คุณสามารถใช้ ห้องสมุดJackson JSON กับ:

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

และจากวัตถุข้อความคุณสามารถดึงคุณสมบัติใด ๆ ของมัน


9

Gsonนั้นง่ายต่อการเรียนรู้และนำไปใช้สิ่งที่เราจำเป็นต้องรู้มีดังต่อไปนี้สองวิธี

  • toJson () - แปลงวัตถุ Java เป็นรูปแบบ JSON

  • fromJson () - แปลง JSON เป็นวัตถุ Java

`

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

    }
}

`


สำหรับความรู้ที่สมบูรณ์เกี่ยวกับ Gson ดูลิงค์ด้านล่าง github.com/google/gson/blob/master/UserGuide.md
venkat

9

มีไลบรารีโอเพนซอร์สมากมายที่นำเสนอเพื่อวิเคราะห์เนื้อหา JSON ไปยังวัตถุหรือเพียงเพื่ออ่านค่า JSON ความต้องการของคุณเป็นเพียงการอ่านค่าและแยกเป็นวัตถุที่กำหนดเอง ดังนั้นห้องสมุด org.json ก็เพียงพอแล้วในกรณีของคุณ

ใช้ไลบรารี org.json เพื่อแยกวิเคราะห์และสร้าง JsonObject:

JSONObject jsonObj = new JSONObject(<jsonStr>);

ตอนนี้ใช้วัตถุนี้เพื่อรับค่าของคุณ:

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

คุณสามารถดูตัวอย่างทั้งหมดได้ที่นี่:

วิธีแยก JSON ใน Java


ดูเหมือนว่าคำตอบทั้งหมดของคุณมีลิงค์ไปยังเว็บไซต์นั้น หากเป็นสแปมโปรดหยุด หากไม่ใช่โปรดขอโทษสำหรับความสับสน แต่ฉันไม่คิดว่าจำเป็นต้องโพสต์ลิงก์ในคำตอบทั้งหมดของคุณ
Donald Duck

1
มันยากที่จะให้คำตอบที่คุณสามารถอธิบายทุกสถานการณ์ เช่นเดียวกับในกรณีนี้วิธีการอ่านอาร์เรย์ json หรือวัตถุ json หลายรายการ แม้ว่าฉันจะทำเช่นนั้นคำตอบก็จะยาวมากและคนอาจสับสน ดังนั้นฉันจึงให้ลิงก์ที่ให้คำอธิบายที่เหมาะสมพร้อมตัวอย่างที่เหมาะสม เขาสามารถเลือกที่จะเยี่ยมชมหรือสามารถใช้คำอธิบายของฉันเท่านั้น
lalitbhagtani

1
สำหรับฉันดูเหมือนว่าลิงก์ที่คุณให้ไว้แสดงให้เห็นถึงวิธีการอ่าน JSON เท่านั้น ฉันจะหาข้อมูลเกี่ยวกับวิธีการ JSON ได้จากที่ใด
Lampros Tzanetos

ขออภัยฉันไม่เข้าใจคำถามของคุณ: - "เกี่ยวกับวิธีการ JSON ด้วย"
lalitbhagtani

7

โปรดทำสิ่งนี้:

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

10
เอ้อห้องสมุดนี้คืออะไร?
Stewart

2
ฉันคิดว่าเขากำลังใช้ org.json.simple
Lasitha Yapa

7

คุณสามารถใช้ห้องสมุด Gson เพื่อแยกสตริง JSON

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

นอกจากนี้คุณยังสามารถวนซ้ำแถว "โพสต์" ดังนี้:

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

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

9
โปรดอธิบายคำตอบของคุณเป็นคำตอบที่ใช้รหัสอย่างเดียวช่วยผู้อื่นให้รหัสน้อยกว่า ดู"ให้คนปลาและคุณฟีดเขาสำหรับวัน; สอนให้คนรู้จักปลาและคุณฟีดเขาสำหรับอายุการใช้งาน"
Wai Ha Lee

คงจะดีถ้าพูดถึงเรื่องนี้มีไว้สำหรับ 'org.json' lib อย่างไรก็ตามฉันไม่คิดว่านี่เป็นวิธีที่ดีในการทำทุกอย่างให้ละเอียดและ lib 'org.json' จะล้าสมัย (API ที่ช้าและยุ่งยาก) มีตัวเลือกที่ดีกว่า: GSON, Jackson, Boon, Genson เพื่อใช้
StaxMan

5

อ่านบล็อกโพสต์ต่อไปนี้JSON ในชวา

โพสต์นี้ค่อนข้างเก่า แต่ก็ยังอยากตอบคำถามของคุณ

ขั้นตอนที่ 1: สร้างคลาส POJO ของข้อมูลของคุณ

ขั้นตอนที่ 2: ตอนนี้สร้างวัตถุโดยใช้ JSON

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

สำหรับการอ้างอิงต่อไปคุณสามารถอ้างถึงต่อไปนี้การเชื่อมโยง


4

คำตอบยอดนิยมในหน้านี้ใช้ตัวอย่างง่ายๆเช่นวัตถุที่มีคุณสมบัติเดียว (เช่น {name: value}) ฉันคิดว่ายังคงเป็นตัวอย่างที่เรียบง่าย แต่ในชีวิตจริงสามารถช่วยคนได้

ดังนั้นนี่คือ JSON ที่ส่งคืนโดย Google Translate API:

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

ฉันต้องการดึงค่าของแอตทริบิวต์ "translateText" เช่น "Arbeit" โดยใช้ Gson ของ Google

สองแนวทางที่เป็นไปได้:

  1. ดึงแอตทริบิวต์ที่จำเป็นเพียงหนึ่งเดียว

    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 จาก 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;

4

ก่อนอื่นคุณต้องเลือกไลบรารีการใช้งานเพื่อทำสิ่งนั้น

Java API สำหรับ JSON การประมวลผล (JSR 353)แสดง APIs แบบพกพาที่จะแยก, สร้าง, เปลี่ยน, และ JSON แบบสอบถามโดยใช้รูปแบบวัตถุและสตรีมมิ่ง APIs

ดำเนินการอ้างอิงอยู่ที่นี่: https://jsonp.java.net/

ที่นี่คุณสามารถค้นหารายการการใช้งานของ JSR 353:

API ที่ใช้งาน JSR-353 (JSON) คืออะไร

และเพื่อช่วยให้คุณตัดสินใจ ... ฉันพบบทความนี้ด้วย:

http://blog.takipi.com/the-ultimate-json-library-json-simple-vs-gson-vs-jackson-vs-json/

หากคุณไปที่ Jackson นี่เป็นบทความที่ดีเกี่ยวกับการแปลงระหว่าง JSON เป็น / จาก Java โดยใช้ Jackson: https://www.mkyong.com/java/how-to-convert-java-object-to-from-json- แจ็คสัน /

หวังว่ามันจะช่วย!


คุณกำลังชี้ไปที่ห้องสมุด Jackson รุ่นที่ 1 ขอแนะนำให้ใช้ไลบรารี Jackson รุ่นปัจจุบัน
เฮอร์เบิร์ตยู

4

คุณสามารถใช้Jayway JsonPath ด้านล่างเป็นลิงค์ GitHub พร้อม source code รายละเอียด pom และเอกสารที่ดี

https://github.com/jayway/JsonPath

กรุณาทำตามขั้นตอนด้านล่าง

ขั้นตอนที่ 1 : เพิ่มการพึ่งพาพา ธ jayway JSON ในคลาสพา ธ ของคุณโดยใช้ Maven หรือดาวน์โหลดไฟล์ JAR และเพิ่มด้วยตนเอง

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

ขั้นตอนที่ 2 : โปรดบันทึก JSON อินพุตของคุณเป็นไฟล์สำหรับตัวอย่างนี้ ในกรณีของฉันฉันบันทึก JSON ของคุณเป็น sampleJson.txt หมายเหตุคุณพลาดเครื่องหมายจุลภาคระหว่าง pageInfo และโพสต์

ขั้นตอนที่ 3 : อ่านเนื้อหา JSON จากไฟล์ด้านบนโดยใช้ bufferedReader และบันทึกเป็นสตริง

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

ขั้นตอนที่ 4 : แยกสตริง JSON ของคุณโดยใช้ jayway JSON parser

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

ขั้นตอนที่ 5 : อ่านรายละเอียดด้านล่าง

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

ผลลัพธ์จะเป็น :

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

3

ฉันมี JSON เช่นนี้:

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

คลาส Java

class PageInfo {

    private String pageName;
    private String pagePic;

    // Getters and setters
}

รหัสสำหรับการแปลง JSON นี้เป็นคลาส Java

    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>

2

หนึ่งสามารถใช้Apache @Model คำอธิบายประกอบในการสร้างJavaเรียนแบบคิดเป็นโครงสร้างของJSONไฟล์และใช้พวกเขาในการเข้าถึงองค์ประกอบต่างๆในJSONต้นไม้ แตกต่างจากโซลูชันอื่น ๆ วิธีนี้ใช้ได้อย่างสมบูรณ์โดยไม่มีการสะท้อนกลับและเหมาะสำหรับสภาพแวดล้อมที่ไม่สามารถทำการสะท้อนได้หรือมีค่าใช้จ่ายสูง

มีโครงการ Maven ตัวอย่างที่แสดงการใช้งาน ก่อนอื่นจะกำหนดโครงสร้าง:

@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 {
    }
}

จากนั้นจะใช้คลาส RepositoryInfo และ Owner ที่สร้างขึ้นเพื่อวิเคราะห์สตรีมอินพุตที่จัดเตรียมไว้และเลือกข้อมูลบางอย่างขณะทำดังนี้

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

อย่างนั้นแหละ! นอกจากนี้ที่นี่เป็นส่วนสำคัญสดแสดงตัวอย่างที่คล้ายกันพร้อมกับการสื่อสารเครือข่ายไม่ตรงกัน


2

jsoniter(jsoniterator) เป็นไลบรารี json ที่ค่อนข้างใหม่และเรียบง่ายออกแบบมาให้เรียบง่ายและรวดเร็ว สิ่งที่คุณต้องทำในการ deserialize ข้อมูล json คือ

JsonIterator.deserialize(jsonData, int[].class);

โดยที่jsonDataเป็นสตริงของข้อมูล json

ตรวจสอบเว็บไซต์อย่างเป็นทางการ สำหรับข้อมูลเพิ่มเติม


1

เราสามารถใช้คลาส JSONObject เพื่อแปลงสตริง JSON เป็นออบเจ็กต์ JSON และย้ำเหนือวัตถุ JSON ใช้รหัสต่อไปนี้

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

2
นี่เป็น android เท่านั้น
Ľubomír

มันไม่ใช่แค่หุ่นยนต์: docs.oracle.com/javaee/7/api/javax/json/JsonObject.html
Dermot Canniffe

1
@DermotCanniffe เป็นเพียง Android
user4020527

1

คุณสามารถใช้ไลบรารีการวิเคราะห์สตรีมDSMสำหรับการแยกวิเคราะห์เอกสาร json และ XML ที่ซับซ้อน DSM แยกวิเคราะห์ข้อมูลเพียงครั้งเดียวและไม่โหลดข้อมูลทั้งหมดลงในหน่วยความจำ

สมมติว่าเรามีPage class เพื่อทำการ deserialize ข้อมูล json ที่ได้รับ

คลาสเพจ

public class Page {
    private String pageName;
    private String pageImage;
    private List<Sting> postIds;

    // getter/setter

}

สร้างไฟล์ yaml Mapping

result:
  type: object     # result is array
  path: /posts
  fields:
    pageName:
        path: /pageInfo/pageName
    pageImage:
        path: /pageInfo/pagePic
    postIds:
      path: post_id
      type: array

ใช้ DSM เพื่อแยกฟิลด์

DSM dsm=new DSMBuilder(new File("path-to-yaml-config.yaml")).create(Page.class);
Page page= (Page)dsm.toObject(new path-to-json-data.json");

ตัวแปรหน้าต่อเนื่องเป็น json:

{
  "pageName" : "abc",
  "pageImage" : "http://example.com/content.jpg",
  "postIds" : [ "123456789012_123456789012" ]
}

DSM ดีมากสำหรับ json และ xml ที่ซับซ้อน


0

คุณสามารถใช้JsonNodeสำหรับการแสดงต้นไม้ที่มีโครงสร้างของสตริง JSON ของคุณ มันเป็นส่วนหนึ่งของห้องสมุดหินแข็งแจ็สันซึ่งอยู่ทั่วไปทุกหนทุกแห่ง

ObjectMapper mapper = new ObjectMapper();
JsonNode yourObj = mapper.readTree("{\"k\":\"v\"}");
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.