概述

序列化(deserialization)过程涉及将一个对象(或数据)的JSON表示转换为编程语言中的等效对象,例如Java对象。Gson,一个流行的用于JSON序列化和反序列化的Java库,简化了这个过程。

在这个教程中,我们将探讨如何使用Gson将JSON数据反序列化为Java记录。

1. 创建Java记录

在深入代码示例之前,我们需要确保项目中添加了Gson库。我们可以在构建工具(如Maven或Gradle)中将其作为依赖项添加。对于Maven,我们可以添加以下依赖:

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.9</version>
</dependency>

首先,我们定义一个简单的Java记录(Record),用于反序列化。例如,考虑一个包含nameageaddress字段的Person记录:

public rеcord Pеrson(String namе, int agе, String addrеss) {
    // No nееd to еxplicitly dеfinе constructors, gеttеrs, or othеr mеthods
}

2. 将JSON反序列化为Java记录

现在,让我们看看如何使用Gson将JSON数据反序列化为Person记录。假设我们有以下Person的JSON表示:

{ "name": "John Doe", "age": 30, "address": "123 Main St" }

我们可以使用Gson的fromJson()方法将这个JSON字符串转换为Person记录:

@Test
public void givenJsonString_whenDeserialized_thenPersonRecordCreated() {
    String json = "{\"name\":\"John Doe\",\"age\":30,\"address\":\"123 Main St\"}";

    Person person = new Gson().fromJson(json, Person.class);

    assertEquals("John Doe", person.name());
    assertEquals(30, person.age());
    assertEquals("123 Main St", person.address());
}

在这个例子中,fromJson()方法接受JSON字符串和应该转换的目标类类型(Person.class)。随后,Gson自动将JSON字段映射到相应的记录组件。

3. 处理嵌套对象

如果我们的JSON包含嵌套的对象怎么办?Gson同样可以处理它们!

扩展我们的Person记录,以包含个人联系信息的Contact记录:

public record Contact(String email, String phone) {
    // Constructor, getters, and other methods are automatically generated
}
public record Person(String name, int age, String address, Contact contact) {
    // Constructor, getters, and other methods are automatically generated
}

现在,考虑一个包含联系信息的JSON表示:

{ "namе": "John Doе", "agе": 30, "addrеss": "123 Main St", "contact": { "еmail": "john.doе@еxamplе.com", "phonе": "555-1234" } }

反序列化代码几乎保持不变,Gson会处理嵌套的对象:

@Test
public void givenNestedJsonString_whenDeserialized_thenPersonRecordCreated() {
    String json = "{\"name\":\"John Doe\",\"age\":30,\"address\":\"123 Main St\",\"contact\":{\"email\":\"[email protected]\",\"phone\":\"555-1234\"}}";

    Person person = new Gson().fromJson(json, Person.class);

    assertNotNull(person);
    assertEquals("John Doe", person.name());
    assertEquals(30, person.age());
    assertEquals("123 Main St", person.address());

    Contact contact = person.contact();

    assertNotNull(contact);
    assertEquals("[email protected]", contact.email());
    assertEquals("555-1234", contact.phone());
}

4. 总结

总之,Gson和Java记录的结合提供了一种简洁而表达力强的方式来处理JSON反序列化,即使涉及到嵌套结构。

如往常一样,本文的所有完整代码示例可在GitHub上找到