Java中Gson的使用详解

Java中Gson的使用详解

Gson是Google提供的一种Java序列化/反序列化库,可让Java对象与JSON序列进行转换。Gson可以从 JSON 中读取 Java 对象,也可以将 Java 对象转换到 JSON 中。因此,Gson可以轻松地将Java对象序列化为JSON格式的字符串,也可以将JSON格式的字符串反序列化为Java对象。

Gson基础使用

添加依赖

首先,我们需要将Gson添加到我们的项目中。你可以通过以下Maven坐标引入:

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

或者将以下Gradle代码添加到你的项目中:

dependencies {
    implementation 'com.google.code.gson:gson:2.8.7'
}

Java对象转JSON格式字符串

我们可以使用toJson()方法将Java对象转换为JSON格式字符串:

User user = new User("张三", 18);
Gson gson = new Gson();
String json = gson.toJson(user);
System.out.println(json); //输出 {"name":"张三","age":18}

在上面的示例中,我们创建了一个名为user的Java对象,并使用toJson()方法将其转换为JSON格式字符串。在这里,我们使用了gson.toJson()方法将对象转换为JSON格式字符串,该对象提供以下公共方法:

class User {
    private String name;
    private int age;

    // 构造函数、getter和setter方法等(省略)
}

JSON格式字符串转Java对象

我们可以使用fromJson()方法将JSON格式字符串转换为Java对象:

String json = "{\"name\":\"张三\",\"age\":18}";
Gson gson = new Gson();
User user = gson.fromJson(json, User.class);
System.out.println(user.toString()); // 输出 User{name='张三', age=18}

在上面的示例中,我们创建了一个JSON格式字符串,并使用Gson的fromJson()方法将其转换为Java对象。fromJson()方法具有以下签名:public <T> T fromJson(String json, Class<T> classOfT) throws JsonSyntaxException。JsonSyntaxException是Gson提供的异常类,如果JSON格式不正确,则会引发该异常。classOfT参数用于指定要转换的对象的类型。

Gson的高级用法

除了上面的基本用法,Gson还提供了许多高级用法。在这里,我们将介绍Gson的两个高级用法:自定义JSON序列化和反序列化规则以及处理JSON嵌套。

自定义JSON序列化和反序列化规则

我们可以通过实现JsonSerializer和JsonDeserializer接口来自定义JSON序列化和反序列化规则。

自定义序列化规则

接下来,我们将从对象中获取年龄,并将其转换为数字字符串格式。代码如下所示:

public class UserAgeJsonSerializer implements JsonSerializer<User> {

    @Override
    public JsonElement serialize(User src, Type typeOfSrc, JsonSerializationContext context) {
        JsonObject jsonObject = new JsonObject();
        jsonObject.addProperty("name", src.getName());
        jsonObject.addProperty("age", String.valueOf(src.getAge())); // 将age转为字符串
        return jsonObject;
    }
}

在上面的示例中,我们创建一个UserAgeJsonSerializer类并实现JsonSerializer接口。在serialize()方法中,我们使用JsonOjbect对象创建一个新的JSON对象,并使用addProperty方法将name和age字段添加到该对象中。

现在,我们已经实现了UserAgeJsonSerializer序列化器,我们可以在Gson对象的builder中使用registerTypeAdapter方法将其注册为User类的序列化程序,如下所示:

Gson gson = new GsonBuilder()
        .registerTypeAdapter(User.class, new UserAgeJsonSerializer())
        .create();

User user = new User("张三", 18);
String json = gson.toJson(user);
System.out.println(json); // 输出 {"name":"张三","age":"18"}

自定义反序列化规则

我们可以通过实现JsonDeserializer接口来自定义反序列化规则。代码如下所示:

public class UserAgeJsonDeserializer implements JsonDeserializer<User> {

    @Override
    public User deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        JsonObject jsonObject = json.getAsJsonObject();
        String name = jsonObject.get("name").getAsString();
        int age = Integer.parseInt(jsonObject.get("age").getAsString());
        return new User(name, age);
    }
}

在上面的示例中,我们创建一个UserAgeJsonDeserializer类并实现JsonDeserializer接口。在deserialize()方法中,我们从JsonElement对象中获取JSON数据,并将其转换为User对象。我们使用getAsJsonObject()方法获取包含数据的JSON对象。接下来,我们使用getAsString()或getAsInt()等JsonElement对象的方法从JSONObject中获取数据,并将其转换为适当的数据类型。

现在,我们已经实现了UserAgeJsonDeserializer序列化器,我们可以在Gson对象的builder中使用registerTypeAdapter方法将其注册为User类的反序列化程序,如下所示:

Gson gson = new GsonBuilder()
        .registerTypeAdapter(User.class, new UserAgeJsonDeserializer())
        .create();

String json = "{\"name\":\"张三\",\"age\":\"18\"}";
User user = gson.fromJson(json, User.class);
System.out.println(user.toString()); // 输出 User{name='张三', age=18}

处理JSON嵌套

如果我们的Java对象具有复杂的结构,包含嵌套的对象,我们可以使用Gson处理嵌套的JSON数据。

嵌套对象

让我们考虑一种情况,我们的User类包含Address对象。我们将使用Gson来序列化此结构,如下所示:

class User {
    private String name;
    private int age;
    private Address address;

    // 构造函数、getter和setter方法等(省略)
}

class Address {
    private String province;
    private String city;

    // 构造函数、getter和setter方法等(省略)
}

我们可以使用以下语法将User的address字段序列化到JSON对象中:

Gson gson = new Gson();
User user = new User("张三", 18);
Address address = new Address();
address.setProvince("北京市");
address.setCity("北京市");
user.setAddress(address);

String json = gson.toJson(user);
System.out.println(json); 
// 输出 {"name":"张三","age":18,"address":{"province":"北京市","city":"北京市"}}

嵌套集合

如果我们的Java对象包含嵌套的集合,我们可以使用以下语法将集合序列化为JSON。例如,如果我们的User类包含一个List

字段:

class User {
    private String name;
    private int age;
    private List<Address> addressList;

    // 构造函数、getter和setter方法等(省略)
}

我们可以使用以下语法将addressList序列化到JSON对象中:

Gson gson = new Gson();
User user = new User("张三", 18);

List<Address> addressList = new ArrayList<>();
Address address1 = new Address();
address1.setProvince("北京市");
address1.setCity("北京市");

Address address2 = new Address();
address2.setProvince("上海市");
address2.setCity("上海市");

addressList.add(address1);
addressList.add(address2);

user.setAddressList(addressList);

String json = gson.toJson(user);
System.out.println(json); 
// 输出 {"name":"张三","age":18,"addressList":[{"province":"北京市","city":"北京市"},{"province":"上海市","city":"上海市"}]}

解析这样的嵌套集合也很简单。要将JSON数据解析到嵌套集合中,我们只需要提供合适的对象:

String json = "{\"name\":\"张三\",\"age\":18,\"addressList\":[{\"province\":\"北京市\",\"city\":\"北京市\"},{\"province\":\"上海市\",\"city\":\"上海市\"}]}";
Gson gson = new Gson();
User user = gson.fromJson(json, User.class);
System.out.println(user.toString()); 
// 输出 User{name='张三', age=18, addressList=[Address{province='北京市', city='北京市'}, Address{province='上海市', city='上海市'}]}

总结

Gson是一个轻量级、开源、易于使用的Java库,可用于将Java对象序列化为JSON格式字符串,以及将JSON格式字符串反序列化为Java对象。上述攻略中,我们简要介绍了Gson的基础和高级用法,并提供了自定义JSON规则序列化、反序列化和嵌套对象和集合的示例。Gson可以轻松地处理复杂结构的Java对象,并将其转换为JSON格式,这使得它成为现代Java开发中必不可少的工具之一。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java中Gson的使用详解 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • 详解SpringBoot中的参数校验(项目实战)

    详解SpringBoot中的参数校验(项目实战) 在Spring Boot中,参数校验是一个非常重要的功能,它可以帮助我们在接口层面对请求参数进行校验,避免了一些不必要的错误和异常。本文将详细讲解Spring Boot中的参数校验功能,包括以下内容: 参数校验的基本概念 Spring Boot中的参数校验实现方法 示例一:使用注解方式进行参数校验 示例二:使…

    Java 2023年5月15日
    00
  • Java ArrayList的底层实现方法

    Java中的ArrayList是一种动态数组数据结构,底层通过数组实现,其大小可以随时增加或缩小。ArrayList可以存储任何类型的数据,而不仅仅是对象。下面将介绍Java ArrayList的底层实现方法。 一、数据结构 ArrayList底层的数据结构是数组,其构造方法为: public ArrayList() { this.elementData =…

    Java 2023年5月26日
    00
  • 浅谈java中字符串数组、字符串、整形之间的转换

    浅谈Java中字符串数组、字符串、整形之间的转换 在Java开发中,字符串数组、字符串和整形的相互转换是非常常见的操作。本攻略将详细介绍不同类型的数据之间的转换方法。 字符串数组和字符串的转换 将字符串数组转换为字符串 我们可以使用Java提供的String.join()方法将字符串数组转换成一个字符串。该方法将数组元素连接为一个字符串,每个元素之间插入指定…

    Java 2023年5月26日
    00
  • Java基础知识之ByteArrayInputStream流的使用

    Java基础知识之ByteArrayInputStream流的使用 在Java中,InputStream是输入流的抽象类,定义了读取字节流的基本方法和抽象行为。其中,ByteArrayInputStream是InputStream的实现类之一。 ByteArrayInputStream流主要用于从一个字节数组中读取数据。下面将详细介绍ByteArrayInp…

    Java 2023年5月26日
    00
  • java使用Apache工具集实现ftp文件传输代码详解

    Java使用Apache工具集实现FTP文件传输详解 本篇攻略将介绍如何在Java中使用Apache工具集实现FTP文件传输。Apache工具集是一个非常流行的Java库,它的FTP组件提供了很多功能,例如连接FTP服务器、上传和下载文件以及列出目录中的文件等。在本文章中,我们将详细解释如何在Java中使用Apache工具集实现FTP文件传输。 前置条件 A…

    Java 2023年6月2日
    00
  • java如何连接数据库executeUpdate()和executeQuery()

    连接数据库是Java中常见的操作之一,可以通过SQL语句实现数据的增、删、改、查等操作。而executeUpdate()和executeQuery()是Java中连接数据库最常使用的方法之一。下面我们就来详细讲解一下这两个方法的使用。 什么是executeUpdate()方法? executeUpdate()方法是由JDBC中的Statement对象提供的接…

    Java 2023年5月19日
    00
  • java多线程-读写锁原理

    下面就为您提供“Java多线程-读写锁原理”的完整攻略。希望对您有所帮助。 1. 读写锁简介 Java中的读写锁是一种特殊的锁,它对于多个线程的访问有着不同的限制。 一般情况下,读锁是共享锁,可以被多个线程共享;写锁是独占锁,只能被单个线程所持有。 在Java中,读写锁的实现是通过ReentrantReadWriteLock类来进行的。在该类中,提供了读锁和…

    Java 2023年5月19日
    00
  • java生成指定范围随机数的多种代码

    下面是“java生成指定范围随机数”的完整攻略: 1. 使用java.util.Random类生成随机数 使用java.util.Random类可以生成随机数,这个类提供了一系列的方法来生成数字、布尔值和伪随机字节流。 代码示例1:生成指定范围的随机数 下面是一个例子,生成指定范围内的随机数: import java.util.Random; public …

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部