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详解线程池与多线程及阻塞队列的应用详解

    Spring Boot详解线程池与多线程及阻塞队列的应用详解 概述 在 Java 中使用线程池和多线程可以提高程序的并发处理能力,加快计算速度。Spring Boot 提供了良好的支持,本文将介绍 Spring Boot 中线程池与多线程及阻塞队列的应用,并通过示例说明。 线程池 线程池的作用 线程池可以减少线程的创建和销毁所带来的性能开销,并可以对并发执行…

    Java 2023年5月19日
    00
  • 总结Java对象被序列化的两种方法

    下面就是“总结Java对象被序列化的两种方法”的完整攻略。 第一种方法:实现Serializable接口 Java提供了一个Serializable接口,如果想让一个对象可序列化,只需要在该类上实现Serializable接口即可。实现Serializable接口的类,系统会自动为其生成一个serialVersionUID值,它是序列化版本号,用于在反序列化…

    Java 2023年5月26日
    00
  • Java struts2捕获404错误的方法汇总

    Java struts2捕获404错误的方法汇总 在使用Java struts2开发Web应用时,404错误是比较常见的错误之一。当客户端请求的URL在服务器中不存在时,就会返回404错误。而如何正确地捕获404错误,处理并给用户一个友好的提示信息,则需要开发者进行处理。 下面将介绍两种捕获404错误的方法: 方法一:利用struts2的异常处理机制 在st…

    Java 2023年5月20日
    00
  • Java binarysearch方法原理详解

    Java binarySearch方法原理详解 什么是binarySearch方法 binarySearch方法是Java Util API提供的的一个静态方法,用于在有序数组中二分查找指定的值。 binarySearch方法原理 binarySearch方法实际上是对比给定值与数组中间值的大小,如果给定值小于中间值,则继续在左半部分递归查找;如果大于,则在…

    Java 2023年5月26日
    00
  • 在Spring Boot中加载初始化数据的实现

    在Spring Boot中加载初始化数据的实现有很多种方法,下面给出两种示例来介绍具体实现过程: 示例一:使用命令行来加载初始化数据 创建Spring Boot项目 首先,我们需要创建一个Spring Boot项目。可以使用IDE或者Maven命令行等方式来创建。 编写初始化数据 在src/main/resources目录下创建一个data.sql文件,文件…

    Java 2023年5月20日
    00
  • java外部类与内部类简介

    Java中的类可以定义在另一个类的内部,这些类被称为内部类。内部类可以访问外部类的私有成员,并且可以被外部类以及其他类所使用。在本文中,我们将会介绍Java中的外部类和内部类。 外部类 首先,我们来看看外部类的概念。外部类是指独立存在的类,它不是定义在另一个类的内部,而是作为一个独立的实体存在。通常来说,Java程序都会包含一个或多个外部类。 以下是一个外部…

    Java 2023年5月26日
    00
  • Java 函数编程详细介绍

    Java 函数编程详细介绍 什么是函数编程 函数编程是一种编程范式,它将计算机程序视为数学函数的组合,避免了代码状态的改变和可变数据的使用。函数编程强调函数的纯洁性和不可变性,更关注数据的转换和流,而不只是程序的执行顺序。 Java 中的函数编程 在 Java 中,函数编程由 Lambda 表达式和函数接口的引入开始。Lambda 表达式是一种轻量级的语法,…

    Java 2023年5月23日
    00
  • 利用Kotlin实现破解Android版的微信小游戏–跳一跳

    Title: 利用Kotlin实现破解Android版的微信小游戏–跳一跳 简介 本文将介绍如何利用 Kotlin 开发一个 Android 应用程序,来破解微信小游戏“跳一跳”。本文将包含两个示例说明。 前置知识 了解 Android 开发基础知识 掌握 Kotlin 编程语言 对 Android Studio 熟练掌握 需要的工具 Android St…

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