如何在Java中解析JSON

时间:2010-04-07 09:00:22

标签: java json parsing

我有以下JSON文本。如何解析它以获取pageNamepagePicpost_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"
         }
    ]
}

33 个答案:

答案 0 :(得分:667)

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

找到更多示例

可下载jar:http://mvnrepository.com/artifact/org.json/json

答案 1 :(得分:485)

为了举例说明,我们假设您只有Person的课程 name

private class Person {
    public String name;

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

Google GSONMaven

我个人最喜欢的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.JSONMaven

如果您不需要对象反序列化但只需获取属性,您可以尝试org.json(或查看上面的GSON示例!

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

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

JacksonMaven

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

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

答案 2 :(得分:91)

  1. 如果想要从JSON创建Java对象,反之亦然,请使用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字符串以通过线路发送),只需使用包含JsonReader,JsonArray,JsonObject等的JaveEE jar。您可能需要像javax.json一样下载该规范的实现。通过这两个jar,我能够解析json并使用这些值。

    这些API实际上遵循XML的DOM / SAX解析模型。

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

答案 3 :(得分:70)

quick-json parser非常简单,灵活,快速且可自定义。试试吧

特点:

  • 符合JSON规范(RFC4627)
  • 高性能JSON解析器
  • 支持灵活/可配置的解析方法
  • 可配置验证任何JSON层次结构的键/值对
  • 易于使用#占地面积小
  • 提高开发人员友好且易于跟踪的异常
  • 可插入自定义验证支持 - 可以通过在遇到时配置自定义验证器来验证密钥/值
  • 验证和非验证解析器支持
  • 支持两种类型的配置(JSON / XML)以使用quick-JSON验证解析器
  • 需要JDK 1.5
  • 不依赖外部库
  • 通过对象序列化支持JSON生成
  • 在解析过程中支持收集类型选择

可以像这样使用:

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

答案 4 :(得分:34)

A - 解释

您可以使用 Jackson 库将JSON字符串绑定到 POJO 普通旧Java对象 )实例。 POJO只是一个只有私有字段和公共getter / setter方法的类。 Jackson将遍历这些方法(使用 reflection ),并将JSON对象映射到POJO实例,因为该类的字段名称适合JSON对象的字段名称。

在JSON对象中,实际上是复合对象,主对象包含两个子对象。因此,我们的POJO类应该具有相同的层次结构。我将整个JSON对象称为 Page 对象。 页面对象包含 PageInfo 对象和帖子对象数组。

所以我们必须创建三个不同的POJO类;

  • 页面类, PageInfo 的组合以及发布实例
  • 的数组
  • PageInfo
  • 帖子

我唯一使用的软件包是Jackson ObjectMapper,我们所做的是绑定数据;

com.fasterxml.jackson.databind.ObjectMapper

所需的依赖项,jar文件列在下面;

  • 杰克逊 - 芯 - 2.5.1.jar
  • 杰克逊 - 数据绑定-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 - Child POJO Class: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 - Child POJO Class:Post

package com.levo.jsonex.model;

public class Post {

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

    public String getPost_id() {
        return post_id;
    }

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

    public String getActor_id() {
        return actor_id;
    }

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

    public String getPicOfPersonWhoPosted() {
        return picOfPersonWhoPosted;
    }

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

    public String getNameOfPersonWhoPosted() {
        return nameOfPersonWhoPosted;
    }

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

    public String getMessage() {
        return message;
    }

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

    public int getLikesCount() {
        return likesCount;
    }

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

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

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

    public int getTimeOfPost() {
        return timeOfPost;
    }

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

}

E - 示例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

答案 5 :(得分:33)

几乎所有给出的答案都需要在访问感兴趣的属性中的值之前将JSON完全反序列化为Java对象。另一种不采用此方法的方法是使用JsonPATH,它类似于XPath for JSON,并允许遍历JSON对象。

这是一个规范,JayWay的优秀人员为规范创建了一个Java实现,您可以在这里找到: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的其他方法的更多信息。

答案 6 :(得分:29)

您可以使用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);

您可以使用this等在线工具自动从JSON生成模型。

答案 7 :(得分:22)

使用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>

答案 8 :(得分:19)

我认为最佳做法应该是通过仍在进行中的官方Java JSON API

答案 9 :(得分:18)

以下示例显示了如何阅读问题中的文本,表示为“jsonText”变量。此解决方案使用Java EE7 javax.json API(在其他一些答案中提到)。我将其作为单独答案添加的原因是以下代码显示了如何实际访问问题中显示的某些值。运行此代码需要implementation of the javax.json API。包含了所需的每个类的完整包,因为我不想声明“import”语句。

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或任何其他可用的第三方框架之前,这个答案之前,这是一个解决问题的“必需代码”的例子。提供了文字。我很清楚adherence to the current standard JSR 353 was not being considered for JDK 9因此JSR 353 spec应该与任何其他第三方JSON处理实现一样对待。

答案 10 :(得分:14)

由于没有人提及它,这里是使用Nashorn(Java 8的JavaScript运行时部分,但在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();

在这种情况下,杰克逊比Nashorn表现更好,Nashorn的表现要比org.json好得多。 Nashorn API比org.json或Jackson更难使用。根据您的要求,Jackson和Nashorn都可以成为可行的解决方案。

答案 11 :(得分:14)

这让我心烦意乱。您只需将保存JSON的String传递给默认org.json包中的JSONObject的构造函数即可。

JSONArray rootOfPage =  new JSONArray(JSONString);

完成。 丢弃麦克风。 这也适用于JSONObjects。之后,您可以使用对象上的Objects方法查看get()的层次结构。

答案 12 :(得分:12)

Java中有许多JSON库。

最臭名昭着的是:Jackson,GSON,Genson,FastJson和org.json。

选择任何库时,通常需要考虑三件事:

  1. 性能
  2. 易于使用(代码易于编写且易读) - 具有功能。
  3. 适用于移动应用:依赖/ jar大小
  4. 特别是对于JSON库(以及任何序列化/反序列化库),数据绑定通常也很有用,因为它不需要编写样板代码来打包/解压缩数据。

    对于1,请参阅此基准:https://github.com/fabienrenaud/java-json-benchmark我使用JMH使用流和数据绑定API比较(jackson,gson,genson,fastjson,org.json,jsonp)序列化程序和反序列化程序的性能。 对于2,您可以在Internet上找到大量示例。上面的基准也可以作为例子来源......

    快速取消基准:杰克逊比org.json好5到6倍,比GSON好两倍以上。

    对于您的特定示例,以下代码使用jackson解码您的json:

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

    如果您有任何问题,请与我们联系。

答案 13 :(得分:9)

除了其他答案之外,我还建议使用这个在线开源服务jsonschema2pojo.org,以便从json或json架构为GSON,Jackson 1.x或Jackson 2.x快速生成Java类。例如,如果您有:

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

GSON生成的jsonschema2pojo.org

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

答案 14 :(得分:9)

有许多开源库可用于将JSON内容解析为对象或仅读取JSON值。您的要求只是读取值并将其解析为自定义对象。所以org.json库就足够了。

使用org.json库解析它并创建JsonObject:

JSONObject jsonObj = new JSONObject(<jsonStr>);

现在,使用此对象获取您的值:

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

你可以在这里看到一个完整的例子:

How to parse JSON in Java

答案 15 :(得分:9)

如果你有一些代表JSON字符串(jsonString)的Java类(比如Message),你可以使用Jackson JSON库:

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

并且可以从消息对象中获取其任何属性。

答案 16 :(得分:8)

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

    }
}

`

答案 17 :(得分:7)

请做这样的事情:

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

答案 18 :(得分:6)

您可以使用Gson Library来解析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();

你也可以循环浏览“posts”数组:

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

答案 19 :(得分:5)

阅读以下博客文章JSON in Java

这篇文章有点陈旧,但我仍然想回答你的问题。

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

如需进一步参考,请参阅以下link

答案 20 :(得分:4)

首先,您需要选择实施库来执行此操作。

JSON处理的Java API(JSR 353)提供了可移植的API,用于使用对象模型和流API来解析,生成,转换和查询JSON。

参考实施位于:https://jsonp.java.net/

在这里,您可以找到JSR 353的实施列表

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

帮助您做出决定 ......我也发现了这篇文章:

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

如果你选择Jackson,这里有一篇关于使用Jackson在JSON与Java之间进行转换的好文章:https://www.mkyong.com/java/how-to-convert-java-object-to-from-json-jackson/

希望它有所帮助!

答案 21 :(得分:4)

此页面的热门答案使用了太简单的示例,例如具有一个属性的对象(例如{name:value})。我认为这仍然是简单但真实的例子可以帮助某人。

所以这是Google Translate API返回的JSON:

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

我想检索“translatedText”属性的值,例如“Arbeit”使用谷歌的Gson。

两种可能的方法:

  1. 只检索一个必需属性

    class ApiResponse {
        Data data;      
        class Data {
            Translation[] translations;         
            class Translation {
                String translatedText;
            }
         }
     }
    
  2. 从JSON创建Java对象

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

    ...

    {{1}}

答案 22 :(得分:4)

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

答案 23 :(得分:3)

您可以使用 Jayway JsonPath 。下面是一个GitHub链接,其中包含源代码,pom详细信息和良好的文档。

https://github.com/jayway/JsonPath

请按照以下步骤操作。

第1步:使用Maven在类路径中添加jayway JSON路径依赖项,或下载JAR文件并手动添加。

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

第2步:请将输入JSON保存为此示例的文件。在我的例子中,我将您的JSON保存为sampleJson.txt。请注意,您错过了pageInfo和帖子之间的逗号。

第3步:使用bufferedReader从上述文件中读取JSON内容,并将其另存为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();

第4步:使用jayway JSON解析器解析您的JSON字符串。

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

答案 24 :(得分:2)

我有这样的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>

答案 25 :(得分:2)

if let age = ageTextField.text then use age // here age is unwrapped as if let verfies that it has non-nil value } (jsoniterator)是一个相对较新且简单的json库,旨在简单快速。反序列化json数据所需要做的就是

jsoniter

其中JsonIterator.deserialize(jsonData, int[].class); 是json数据的字符串。

查看official website 有关更多信息。

答案 26 :(得分:2)

如果您有maven项目,则在下面的依赖项或普通项目中添加json-简单jar。

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

在Java代码下面编写用于将JSON字符串转换为JSON数组的

JSONArray ja = new JSONArray(String jsonString);

答案 27 :(得分: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));
  }
}

答案 28 :(得分:1)

可以使用Apache @Model annotation创建表示 JSON 文件结构的 Java 模型类,并使用它们访问 JSON中的各种元素树。与其他解决方案不同,这个完全没有反射,因此适用于无法反射或带来显着开销的环境。

sample Maven project显示用法。首先,它定义了结构:

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

就是这样!除此之外,还有一个live gist与异步网络通信一起显示类似示例。

答案 29 :(得分:1)

您可以使用DSM流解析库来解析复杂的json和XML文档。 DSM仅解析一次数据,而不会将所有数据加载到内存中。

假设我们有 Page 类可反序列化给定的json数据。

页面类

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

    // getter/setter

}

创建Yaml映射文件。

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

page 变量序列化为json:

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

DSM非常适合复杂的json和xml。

答案 30 :(得分:0)

有2个主要选项...

  1. 对象映射。当您将JSON数据反序列化为以下多个实例时:

    1.1。一些预定义的类,例如Maps。在这种情况下,您不必设计自己的POJO类。一些库:org.json.simple https://www.mkyong.com/java/json-simple-example-read-and-write-json/

    1.2。您自己的POJO类。您必须设计自己的POJO类来呈现JSON数据,但是如果您也要将它们用于业务逻辑中,这可能会有所帮助。一些图书馆:Gson,Jackson(请参阅http://tutorials.jenkov.com/java-json/index.html

映射的主要后退之处在于,它导致密集的内存分配(和GC压力)和CPU利用率。

  1. 面向流的解析。例如,Gson和Jackson都支持这种轻量级解析。另外,您可以看一下自定义,快速且无GC的解析器https://github.com/anatolygudkov/green-jelly的示例。如果您需要解析大量数据以及在延迟敏感度应用程序中,则首选这种方式。

答案 31 :(得分:0)

Jakarta(Java)Enterprise Edition 8包括JSON-B(用于JSON绑定的Java API)。因此,如果您使用的是Payara 5这样的Jakarta EE 8服务器,则JSON-B可以直接使用。

一个简单的示例,没有自定义配置:

public static class Dog {
    public String name;
    public int age;
    public boolean bites;
}

// Create a dog instance
Dog dog = new Dog();
dog.name = "Falco";
dog.age = 4;
dog.bites = false;

// Create Jsonb and serialize
Jsonb jsonb = JsonbBuilder.create();
String result = jsonb.toJson(dog);

// Deserialize back
dog = jsonb.fromJson("{\"name\":\"Falco\",\"age\":4,\"bites\":false}", Dog.class);

您可以使用配置,注释,适配器和(反)序列化器customize the mapping

如果您不使用Jakarta EE 8,则可以随时install JSON-B使用。

答案 32 :(得分:-2)

您需要使用jackson库中的JsonNode和ObjectMapper类来获取Json树的节点。在pom.xml中添加以下依赖项以访问Jackson类。

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.5</version>
</dependency>

您将尝试使用以下代码,这样可行:

import com.fasterxml.jackson.core.JsonGenerationException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

Class JsonNodeExtractor{

public void convertToJson(){


String filepath = "c:\\data.json";
ObjectMapper mapper = new ObjectMapper();
JsonNode node =  mapper.readTree(filepath);

// create a JsonNode for every root or subroot element in the Json String
JsonNode pageInfoRoot = node.path("pageInfo");

// Fetching elements under 'pageInfo'
String pageName =  pageInfoRoot.path("pageName").asText();
String pagePic = pageInfoRoot.path("pagePic").asText();

// Now fetching elements under posts
JsonNode  postsNode = node.path("posts");
String post_id = postsNode .path("post_id").asText();
String nameOfPersonWhoPosted = postsNode 
.path("nameOfPersonWhoPosted").asText();

}
}