如何在Java中解析JSON

deyfvvtc  于 2022-09-16  发布在  Java
关注(0)|答案(30)|浏览(356)

我有以下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"
    }
  ]
}
bgibtngc

bgibtngc1#

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

    }
}

`

imzjd6km

imzjd6km2#

您可以将JsonNode用于JSON字符串的结构化树表示。它是岩石固体jackson library的一部分,它无处不在。

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

dwbf0jvd3#

jsoniter(jsoniterator)是一个相对较新且简单的json库,设计简单快速。反序列化json数据所需要做的就是

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

其中jsonData是json数据的字符串。
查看official website了解更多信息。

8mmmxcuj

8mmmxcuj4#

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

就是这样!除此之外,这里还有一个实时的要点,展示了类似的示例以及异步网络通信。

yeotifhr

yeotifhr5#

任何类型的json数组步骤都可以解决这个问题。
1.将JSON对象转换为java对象。
1.您可以使用link或任何在线工具。
1.保存为类似Myclass.java的java类。
1.Myclass obj = new Gson().fromJson(JsonStr, Myclass.class);
1.使用obj,您可以获得您的值。

35g0bw71

35g0bw716#

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

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

编写以下java代码,将JSON字符串转换为JSON数组。

JSONArray ja = new JSONArray(String jsonString);
368yc8dk

368yc8dk7#

本页上的顶部答案使用了太简单的示例,如具有一个属性的对象(例如,{name:value})。我认为这个简单但真实的例子可以帮助一些人。
这是谷歌翻译API返回的JSON:

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

我想使用Google的Gson检索“translatedText”属性的值,例如“Arbeit”。
两种可能的方法:
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();

1.从JSON创建Java对象

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

qvtsj1bj8#

首先,您需要选择一个实现库

**用于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:https://www.mkyong.com/java/how-to-convert-java-object-to-from-json-jackson/在JSON与Java之间进行转换的好文章
希望有帮助!

uplii1fm

uplii1fm9#

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

a5g8bdjr10#

请这样做:

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

7xzttuei11#

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

zbdgwd5y12#

您可以使用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。注意:您在页面信息和帖子之间遗漏了一个逗号。
步骤3:使用bufferedReader从上述文件中读取JSON内容,并将其保存为字符串。

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

7uzetpgm13#

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

您还可以循环“posts”数组,如下所示:

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

g2ieeal714#

阅读以下博客文章,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

ercv8c1e

ercv8c1e15#

有许多开源库用于将JSON内容解析为对象,或者只是读取JSON值。您的需求只是读取值并将其解析为自定义对象。因此,org.json库在您的情况下就足够了。
使用org.json库解析并创建JsonObject:

JSONObject jsonObj = new JSONObject(<jsonStr>);

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

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

您可以在这里看到完整的示例:
How to parse JSON in Java

相关问题