如何用Java解析JSON字符串为一个对象

466 阅读4分钟

JSON格式是使用计算机存储和交换信息的最常用的数据格式之一。

Java有三个流行的库可以帮助你把字符串解析为JSON对象。

尽管你可以在没有这些库的情况下将JSON字符串解析为JSON对象,但除非你准备付出必要的努力,否则一般不建议这样做。

在不使用第三方库的情况下,你需要根据ECMA国际规范来实现JSON解析器的规范,你可以在这里找到。

你需要测试你所创建的解析器库,然后准备维护和改进该库。你还需要编写能够很好地处理错误的JSON字符串格式的代码,否则你可能会产生错误的输出。

简而言之,最好是使用一个经过测试的Java的JSON库,它已经被许多开发者开发,并且足够成熟,可以处理许多使用情况。

本教程将帮助你学习如何使用上述三个库将JSON字符串解析为对象,反之亦然。

让我们从Gson库开始。

使用Gson库在Java中解析JSON

Gson库是一个Java库,用于将Java对象转换成其JSON表示,反之亦然。

Gson库的一个显著特点是对Java泛型的完全支持。

一旦你将该库作为依赖项添加到你的Java项目中,你就可以使用fromJson() 方法将一个字符串转换成一个Java对象。

例如,假设你有一个名为Person 的Java类,其定义如下。

class Person {
String name;
int age;
boolean hasId;
}

你可以将一个字符串解析为Person 类的一个实例,如下所示。

import com.google.gson.Gson;
String jsonStr = """
 {
 "name":"Nathan",
 "age":22,
 "hasId":"true"
 }""";
Gson g = new Gson();
Person me = g.fromJson(jsonStr, Person.class);

System.out.println(me.name); // Nathan
System.out.println(me.age); // 22
System.out.println(me.hasId); // true

你可以用Gson库的toJson() 方法将该对象转回为String ,如下图所示。

String newStr = g.toJson(me);
System.out.println(newStr);
// Output:
// {"name":"Nathan","age":22,"hasId":true}

这就是使用Gson将JSON字符串解析为Java对象的简单方法。

你可以在Gson Github页面上找到关于该库的更多详细信息

使用Jackson库在Java中解析JSON

Jackson库是一个Java的数据处理工具,它不仅可以处理JSON数据格式,还可以处理其他格式,如CSV、TOML、YAML或XML。

不过,由于Jackson能够解析流式JSON数据,因此它在Java和Android开发者中很受欢迎。

为了用Jackson将JSON字符串解析成一个Java对象,你需要创建一个class ,并为其字段提供设置器和获取器,如下图所示。

class Person {
String name;
int age;
boolean hasId;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public boolean isHasId() {
return hasId;
}
public void setHasId(boolean hasId) {
this.hasId = hasId;
}
}

如果没有设置器和获取器,Jackson将无法访问Person类的字段。

下面的代码显示了如何使用Jackson将一个字符串解析为JSON对象。

import com.fasterxml.jackson.databind.ObjectMapper;
ObjectMapper mapper = new ObjectMapper();
String jsonStr = """
 {
 "name":"Nathan",
 "age":22,
 "hasId":true
 }""";
try {
Person me = mapper.readValue(jsonStr, Person.class);
System.out.println(me.name); // Nathan
 System.out.println(me.age); // 22
 System.out.println(me.hasId); // true

} catch (IOException e) {
e.printStackTrace();
}

首先,你需要从Jackson创建一个ObjectMapper 类的实例。这个实例在上面的代码中被命名为mapper

接下来,你需要从mapper 实例中调用readValue() 方法,将String 变量作为第一个参数,将Java蓝图class 作为第二个参数。

要把一个Java对象解析成JSON字符串,你需要从mapper 实例中调用writeValueAsString() 方法,如下所示。

String newStr = mapper.writeValueAsString(me);
System.out.println(newStr);
// {"name":"Nathan","age":22,"hasId":true}

这就是你如何使用Jackson库将一个JSON字符串解析为一个Java对象。

对于高级使用和其他杰克逊附加库,你可以访问杰克逊Github页面

使用JSON-java库在Java中解析JSON

JSON-java库是一个轻量级的Java库,可用于将JSON字符串解析为Java对象,反之亦然。

该库不需要你传递一个Javaclass 作为JSON对象的蓝本。

而不是你定义的class 实例,该对象将是JSONObject 实例的。

下面的代码显示了你如何使用JSON-java库来从JSON字符串中创建一个对象。

import org.json.JSONObject;
String jsonStr = """
 {
 "name":"Nathan",
 "age":22,
 "hasId":true
 }""";
JSONObject jsonObj = new JSONObject(jsonStr);
System.out.println(jsonObj.getString("name")); // Nathan
System.out.println(jsonObj.getInt("age")); // 22
System.out.println(jsonObj.getBoolean("hasId")); // true

要把JSONObject 转换回String ,你可以从实例中调用toString() 方法,如下所示。

String newStr = jsonObj.toString();
System.out.println(newStr);
// Output:
// {"hasId":true,"name":"Nathan","age":22}

JSONObject 的实现类似于Java的HashMap 类,所以键值对的顺序不会被保留。

这就是为什么上面的toString() 方法输出的字符串与原始jsonStr 变量的顺序不一样的原因。

这就是你如何使用JSON-java库解析JSON字符串。

欲了解更多信息,你可以访问JSON-java Github页面

现在你已经学会了如何使用三个最流行的JSON库用Java解析JSON字符串。干得好!👍