java سومطرة - كيفية تحليل JSON في جاوة




الشمالية الاسلام (24)

أ - شرح

يمكنك استخدام مكتبات Jackson ، لربط سلسلة JSON إلى مثيلات POJO ( Plain Old Java Object ). POJO هو مجرد فئة مع الحقول الخاصة فقط وطرق getter / setter العامة. سيقوم جاكسون باجتياز الطرق (باستخدام الانعكاس ) ، ثم يعيّن كائن JSON في مثيل POJO حيث تتناسب أسماء الحقول للفئة مع أسماء الحقول الخاصة بعنصر JSON.

في كائن JSON الخاص بك ، والذي هو في الواقع كائن مركب ، يتكون الكائن الرئيسي o من جسمين فرعيين. لذا ، يجب أن يكون لدينا فئات POJO نفس التسلسل الهرمي. سأتصل بكامل عنصر JSON ككائن الصفحة . يتكون كائن الصفحة من كائن PageInfo و صفيف كائن النشر .

لذلك علينا إنشاء ثلاث فئات مختلفة من POJO ؛

  • فئة الصفحة ، وهو مركب من فئة PageInfo ومجموعة من مثيلات Post
  • فئة PageInfo
  • وظائف الفئة

الحزمة الوحيدة التي استخدمتها هي جاكسون ObjectMapper ، ما نقوم به هو بيانات ملزمة.

com.fasterxml.jackson.databind.ObjectMapper

التبعيات المطلوبة ، يتم سرد ملفات jar أدناه ؛

  • جاكسون النواة 2.5.1.jar
  • جاكسون-DataBind عناصر-2.5.1.jar
  • جاكسون-شروح-2.5.0.jar

هنا هو الرمز المطلوب ؛

ب - الصفحة الرئيسية 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;
    }

}

ج - فئة الطفل 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;
    }

}

د - طفل 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;
    }

}

ه - عينة 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"
         }
    ]
}

واو - قانون العرض

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

}

ز - العرض التجريبي

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

لدي نص 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"
         }
    ]
}

You can use Jayway JsonPath . Below is a GitHub link with source code, pom details and good documentation.

https://github.com/jayway/JsonPath

Please follow the below steps.

Step 1 : Add the jayway JSON path dependency in your class path using Maven or download the JAR file and manually add it.

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

Step 2 : Please save your input JSON as a file for this example. In my case I saved your JSON as sampleJson.txt. Note you missed a comma between pageInfo and posts.

Step 3 : Read the JSON contents from the above file using bufferedReader and save it as 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();

Step 4 : Parse your JSON string using jayway JSON parser.

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

Step 5 : Read the details like below.

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

The output will be :

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

هناك العديد من مكتبات المصدر المفتوح موجودة لتحليل محتوى JSON إلى كائن أو لقراءة قيم JSON فقط. الشرط الخاص بك هو فقط لقراءة القيم وتحليلها إلى كائن مخصص. لذلك مكتبة org.json كافية في قضيتك.

استخدم مكتبة org.json لتحليلها وإنشاء JsonObject:

JSONObject jsonObj = new JSONObject(<jsonStr>);

الآن ، استخدم هذا الكائن للحصول على قيمك:

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

يمكنك رؤية مثال كامل هنا:

كيفية تحليل JSON في جاوة


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

    }
}

`


بالإضافة إلى إجابات أخرى ، أنا أوصي بهذا this خدمة this عبر الإنترنت this 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;
}

هناك العديد من مكتبات JSON المتاحة في Java.

الأكثر شهرة هي: جاكسون ، GSON ، Genson ، FastJson و org.json.

هناك عادة ثلاثة أشياء يجب على المرء النظر إليها لاختيار أي مكتبة:

  1. أداء
  2. سهولة الاستخدام (رمز بسيط للكتابة ومقروء) - يتناسب مع الميزات.
  3. لتطبيقات الجوال: حجم التبعية / الجرة

بشكل خاص للمكتبات JSON (وأي libs التسلسل / deserialization) ، عادة ما يكون ربط البيانات مهمة لأنها تزيل الحاجة لكتابة رمز لوحة المرجل لحزم / تفريغ البيانات.

ل 1 ، انظر هذا المعيار: github.com/fabienrenaud/java-json-benchmark فعلت باستخدام JMH الذي يقارن JMH (جاكسون ، gson ، genson ، fastjson ، org.json ، jsonp) من serializers و deserializers باستخدام تيار و APIs databind. ل 2 ، يمكنك أن تجد العديد من الأمثلة على شبكة الإنترنت. يمكن أيضًا استخدام المؤشر المرجعي أعلاه كمصدر من الأمثلة ...

مقاربة سريعة للمقياس: يقدم جاكسون 5 إلى 6 مرات أفضل من org.json وأكثر من مرتين أفضل من 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.
    }
}

اسمحوا لي أن أعرف إذا كان لديك أي أسئلة.


من أجل المثال ، لنفترض أن لديك شخصًا Person باسم فقط.

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

org.json ( org.json )

إذا لم تكن بحاجة إلى تسلسل الكائن ، ولكن ببساطة للحصول على سمة ، فيمكنك تجربة org.json ( أو البحث عن مثال GSON أعلاه! )

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

يمكنك استخدام 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);

يمكنك إنشاء نموذج من JSON تلقائيًا باستخدام أدوات عبر الإنترنت مثل this .


هذا فجر ذهني مع مدى سهولة. يمكنك فقط تمرير String تحمل JSON إلى مُنشئ JSONObject في الحزمة org.json الافتراضية.

JSONArray rootOfPage =  new JSONArray(JSONString);

فعله. قطرات الميكروفون . هذا يعمل مع JSONObjects كذلك. بعد ذلك ، يمكنك فقط النظر من خلال التسلسل الهرمي Objects باستخدام أساليب get() على الكائنات الخاصة بك.


يوضح المثال أدناه كيفية قراءة النص في السؤال ، والممثل كمتغير "jsonText". يستخدم هذا الحل واجهة برمجة التطبيقات Java EE7 javax.json (والتي تم ذكرها في بعض الإجابات الأخرى). السبب الذي أضفته إليه كإجابة منفصلة هو أن الشفرة التالية تعرض كيفية الوصول إلى بعض القيم المعروضة في السؤال. سيكون تطبيق واجهة برمجة التطبيقات javax.json مطلوبًا لتشغيل هذا الرمز. تم تضمين الحزمة الكاملة لكل من الفئات المطلوبة لأنني لم أكن أريد الإعلان عن عبارات "الاستيراد".

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.


يمكنك استخدام مكتبة 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
}

تتطلب جميع الإجابات المقدمة تقريبًا إلغاء تسلسل كامل لـ JSON في كائن جافا قبل الوصول إلى القيمة في موقع الفائدة. بديل آخر ، لا يذهب هذا الطريق هو استخدام 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.


You can use JsonNode for a structured tree representation of your JSON string. It's part of the rock solid Jackson which is omnipresent.

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

إذا كان لديك بعض فئات Java (مثل Message) تمثل سلسلة JSON (jsonString) ، فيمكنك استخدام مكتبة Jackson JSON مع:

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

ومن كائن الرسالة يمكنك جلب أي من سماته.


استخدم minimal-json سريع جدًا وسهل الاستخدام. يمكنك تحليل من سلسلة 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);

مخضرم:

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

  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 الخ. قد ترغب في تنزيل تطبيق ذلك المواصفات مثل javax.json. مع هاتين الجرار أنا قادر على تحليل json واستخدام القيم.

    تتبع واجهات برمجة التطبيقات هذه فعليًا نموذج تحليل 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");
    


Read the following blog post, JSON in Java .

This post is a little bit old, but still I want to answer you question.

Step 1: Create a POJO class of your data.

Step 2: Now create a object using JSON.

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

For further reference you can refer to the following link .


We can use the JSONObject class to convert a JSON string to a JSON object, and to iterate over the JSON object. Use the following 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));
  }
}

مكتبة org.json سهلة الاستخدام. رمز المثال أدناه:

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

قد تجد أمثلة إضافية من: Parse JSON in Java

جرة قابلة للتنزيل: http://mvnrepository.com/artifact/org.json/json


Top answers on this page use too simple examples like object with one property (eg {name: value}). I think that still simple but real life example can help someone.

So this is the JSON returned by Google Translate API:

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

I want to retrieve the value of "translatedText" attribute eg "Arbeit" using Google's Gson.

Two possible approaches:

  1. Retrieve just one needed attribute

    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. Create Java object from 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;
    

First you need to select an implementation library to do that.

The Java API for JSON Processing (JSR 353) provides portable APIs to parse, generate, transform, and query JSON using object model and streaming APIs.

The reference implementation is here: https://jsonp.java.net/

Here you can find a list of implementations of JSR 353:

What are the API that does implement JSR-353 (JSON)

And to help you decide ... I found this article as well:

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

If you go for Jackson, here is a good article about conversion between JSON to/from Java using Jackson: https://www.mkyong.com/java/how-to-convert-java-object-to-from-json-jackson/

آمل أن يساعد!


بما أن لا أحد ذكر ذلك حتى الآن ، فإليك بداية لحل باستخدام Nashorn (جافا سكريبت runtime جزء من Java 8).

حل

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. ناشرون API أصعب من استخدام org.json أو جاكسون. اعتمادًا على متطلباتك ، يمكن أن يكون كل من Jackson و Nashorn حلولًا قابلة للتطبيق.


HTML DOM بسيط هو محلل كبير مفتوح المصدر:

simplehtmldom.sourceforge

يتعامل مع عناصر DOM بطريقة موجهة للكائنات ، والتكرار الجديد يحتوي على تغطية كبيرة للشفرة غير المتوافقة. هناك أيضًا بعض الوظائف الرائعة مثل التي تراها في جافا سكريبت ، مثل الدالة "find" ، والتي ستعرض جميع أمثلة عناصر اسم العلامة هذا.

لقد استخدمت هذا في عدد من الأدوات ، واختبرته على العديد من أنواع صفحات الويب المختلفة ، وأعتقد أنه يعمل بشكل رائع.





java json parsing