📜  如何在 java 中解析 json - Javascript (1)

📅  最后修改于: 2023-12-03 15:08:38.782000             🧑  作者: Mango

如何在 Java 中解析 JSON

在 Java 中,我们可以使用许多库来解析 JSON 数据。本文将着重介绍两个流行的库:Gson 和 Jackson。以下是使用这两个库解析 JSON 数据的方法。

前置知识

在深入学习 JSON 解析之前,您需要对以下内容有所了解:

  • 基本的 Java 语法
  • JSON 格式及其语法
Gson
什么是 Gson?

Gson 是 Google 提供的一个 Java 库,用于将 Java 对象转换为 JSON 格式,以及将 JSON 格式转换为 Java 对象。它支持注解、泛型等高级特性。

如何使用 Gson 解析 JSON?

我们以以下 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 拥有众多高级特性,在这里我们只介绍其中的两个:

  • 注解

我们可以使用注解来控制 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 转换成 JSON 格式,并将 JSON 格式转换回 Java 对象。

Jackson
什么是 Jackson?

Jackson 是一个由 FasterXML 开发的 Java 库,用于将 Java 对象转换为 JSON 格式,以及将 JSON 格式转换为 Java 对象。它支持注解、泛型、流式 API 等高级特性。

如何使用 Jackson 解析 JSON?

我们以以下 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 同样拥有众多高级特性,在这里我们只介绍其中的两个:

  • 注解

我们可以使用注解类来控制 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 将一个 List 转换成 JSON 格式,并将 JSON 格式转换回 Java 对象。需要注意的是,我们需要使用 TypeFactoryconstructParametricType 方法构造泛型类型的 JavaType 对象。