📅  最后修改于: 2023-12-03 15:08:38.782000             🧑  作者: Mango
在 Java 中,我们可以使用许多库来解析 JSON 数据。本文将着重介绍两个流行的库:Gson 和 Jackson。以下是使用这两个库解析 JSON 数据的方法。
在深入学习 JSON 解析之前,您需要对以下内容有所了解:
Gson 是 Google 提供的一个 Java 库,用于将 Java 对象转换为 JSON 格式,以及将 JSON 格式转换为 Java 对象。它支持注解、泛型等高级特性。
我们以以下 JSON 数据为例:
{
"name": "John",
"age": 25,
"address": {
"street": "Main Street",
"city": "New York"
},
"phoneNumbers": [
"1234567890",
"0987654321"
]
}
我们可以将这个 JSON 数据解析成一个 Java 对象:
import com.google.gson.Gson;
public class Main {
public static void main(String[] args) {
String json = "{\"name\":\"John\",\"age\":25,\"address\":{\"street\":\"Main Street\",\"city\":\"New York\"},\"phoneNumbers\":[\"1234567890\",\"0987654321\"]}";
Gson gson = new Gson();
Person person = gson.fromJson(json, Person.class);
System.out.println(person.getName()); // 输出 John
}
}
class Person {
private String name;
private int age;
private Address address;
private String[] phoneNumbers;
// 省略 getter 和 setter 方法
}
class Address {
private String street;
private String city;
// 省略 getter 和 setter 方法
}
在上面的示例中,我们首先定义了一个 Person 类,它的属性与 JSON 数据的键值对一一对应;然后使用 Gson 将 JSON 数据解析成一个 Person 对象。解析的过程非常简单:我们只需要调用 fromJson
方法并将 JSON 数据传入即可。需要注意的是,Person 类必须具有默认的无参构造函数。
此外,我们还可以将一个 Java 对象转换成 JSON 格式:
Person person = new Person();
person.setName("John");
person.setAge(25);
Gson gson = new Gson();
String json = gson.toJson(person);
System.out.println(json); // 输出 {"name":"John","age":25,"address":null,"phoneNumbers":null}
在上面的示例中,我们将一个 Person 对象转换成了 JSON 格式并保存在一个字符串中。需要注意的是,这里我们并没有将 Address 和 phoneNumbers 属性的值转换成 JSON 格式,而是直接将它们赋值为 null。
Gson 拥有众多高级特性,在这里我们只介绍其中的两个:
我们可以使用注解来控制 Gson 将 Java 对象转换成 JSON 格式时的行为。以下是 Gson 支持的注解列表:
- @SerializedName:指定某个字段的 JSON 名称。
- @Expose:指定某个字段是否参与序列化或反序列化。
示例:
class Person {
@SerializedName("full_name")
private String name;
@Expose(serialize = false)
private int age;
private Address address;
private String[] phoneNumbers;
// 省略 getter 和 setter 方法
}
在上面的示例中,我们使用了 @SerializedName
注解指定了 name 字段在序列化成 JSON 格式时的名称为 full_name,同时使用 @Expose
注解忽略了 age 字段在序列化时的处理。
Gson 支持泛型,我们可以将一个泛型类型转换成 JSON 格式或 Java 对象。以下是一个示例:
Gson gson = new Gson();
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
String json = gson.toJson(list);
System.out.println(json); // 输出 ["a","b","c"]
Type type = new TypeToken<List<String>>(){}.getType();
List<String> result = gson.fromJson(json, type);
System.out.println(result.get(1)); // 输出 b
在上面的示例中,我们使用 Gson 将一个 List
Jackson 是一个由 FasterXML 开发的 Java 库,用于将 Java 对象转换为 JSON 格式,以及将 JSON 格式转换为 Java 对象。它支持注解、泛型、流式 API 等高级特性。
我们以以下 JSON 数据为例:
{
"name": "John",
"age": 25,
"address": {
"street": "Main Street",
"city": "New York"
},
"phoneNumbers": [
"1234567890",
"0987654321"
]
}
我们可以将这个 JSON 数据解析成一个 Java 对象:
import com.fasterxml.jackson.databind.ObjectMapper;
public class Main {
public static void main(String[] args) throws IOException {
String json = "{\"name\":\"John\",\"age\":25,\"address\":{\"street\":\"Main Street\",\"city\":\"New York\"},\"phoneNumbers\":[\"1234567890\",\"0987654321\"]}";
ObjectMapper objectMapper = new ObjectMapper();
Person person = objectMapper.readValue(json, Person.class);
System.out.println(person.getName()); // 输出 John
}
}
class Person {
private String name;
private int age;
private Address address;
private String[] phoneNumbers;
// 省略 getter 和 setter 方法
}
class Address {
private String street;
private String city;
// 省略 getter 和 setter 方法
}
在上面的示例中,我们首先定义了一个 Person 类,它的属性与 JSON 数据的键值对一一对应;然后使用 Jackson 将 JSON 数据解析成一个 Person 对象。解析的过程与 Gson 相似:我们只需要调用 readValue
方法并将 JSON 数据传入即可。
同样,我们也可以将一个 Java 对象转换成 JSON 格式:
Person person = new Person();
person.setName("John");
person.setAge(25);
ObjectMapper objectMapper = new ObjectMapper();
String json = objectMapper.writeValueAsString(person);
System.out.println(json); // 输出 {"name":"John","age":25,"address":null,"phoneNumbers":null}
在上面的示例中,我们将一个 Person 对象转换成了 JSON 格式并保存在一个字符串中。
Jackson 同样拥有众多高级特性,在这里我们只介绍其中的两个:
我们可以使用注解类来控制 Jackson 将 Java 对象转换成 JSON 格式时的行为。以下是 Jackson 支持的注解列表:
- @JsonProperty:指定某个字段的 JSON 名称。
- @JsonInclude:指定某个字段在转换为 JSON 格式时是否包含在内(默认所有字段都包含)。
示例:
class Person {
@JsonProperty("full_name")
private String name;
@JsonInclude(JsonInclude.Include.NON_NULL)
private int age;
private Address address;
private String[] phoneNumbers;
// 省略 getter 和 setter 方法
}
在上面的示例中,我们使用了 @JsonProperty
注解指定了 name 字段在序列化成 JSON 格式时的名称为 full_name,同时使用 @JsonInclude
注解指定了 age 字段在序列化时是否忽略空值。
Jackson 同样支持泛型,我们可以将一个泛型类型转换成 JSON 格式或 Java 对象。以下是一个示例:
ObjectMapper objectMapper = new ObjectMapper();
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
String json = objectMapper.writeValueAsString(list);
System.out.println(json); // 输出 ["a","b","c"]
JavaType type = objectMapper.getTypeFactory().constructParametricType(List.class, String.class);
List<String> result = objectMapper.readValue(json, type);
System.out.println(result.get(1)); // 输出 b
在上面的示例中,我们使用 Jackson 将一个 ListTypeFactory
的 constructParametricType
方法构造泛型类型的 JavaType 对象。