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日

相关文章

  • Java agent 使用实例详解

    Java agent 使用实例详解 Java agent 是 Java 虚拟机提供的一种高级功能,是实现 JVM 监控和动态修改字节码的重要手段。在本文中,我们将详细讲解 Java agent 的使用方法,帮助读者能够更好的理解和应用该技术。 什么是 Java agent Java agent 实际上就是一个 Java 程序,在 JVM 启动时通过启动参数指…

    Java 2023年5月26日
    00
  • java后台如何利用Pattern提取所需字符详解

    下面就是关于“Java后台如何利用Pattern提取所需字符”的完整攻略: 1. 基本概念 在Java中,正则表达式的使用非常重要,而Pattern类就是Java中正则表达式的核心类,用于解析和匹配正则表达式。下面是Pattern类中最基本的方法: public static Pattern compile(String regex) public Matc…

    Java 2023年5月27日
    00
  • ajax详解_动力节点Java学院整理

    AJAX详解 什么是AJAX AJAX(Asynchronous JavaScript and XML)即异步 JavaScript 和 XML,是一种在Web页面中实现异步数据交互的通信技术。它的核心是 XMLHttpRequest 对象,它可以在不刷新页面的情况下发送和接收数据。 AJAX的优点 页面无需刷新,数据实时更新 能够异步加载数据,减少页面加载…

    Java 2023年5月26日
    00
  • Java中Future和FutureTask的示例详解及使用

    Java中Future和FutureTask的示例详解及使用 1. 简介 Java中的Future和FutureTask都是用于异步执行任务的工具类。在某些场景下,任务执行需要花费较长时间,为了避免阻塞主线程或者降低用户体验,可以使用Future和FutureTask来实现任务的异步执行和结果的获取。 Future用于表示异步任务的结果,并提供了相应的方法来…

    Java 2023年5月26日
    00
  • 详细分析JAVA加解密算法

    详细分析JAVA加解密算法 在JAVA中,常用的加解密算法包括对称加密算法、非对称加密算法和HASH算法。在这里,我们将详细分析这些加解密算法的实现过程以及相关代码示例。 对称加密算法 对称加密算法使用同一个密钥进行加密和解密。其加密过程简单、高效,但密钥的共享是该算法的重要瓶颈。 在JAVA中,常用的对称加密算法包括DES、3DES、AES和Blowfis…

    Java 2023年5月19日
    00
  • 小菜编程成长记(一 面试受挫——代码无错就是好?)第1/3页

    下面详细讲解“小菜编程成长记(一 面试受挫——代码无错就是好?)第1/3页”的完整攻略。 1. 了解面试的目的和方式 首先我们需要了解,面试的目的是为了寻找合适的人选,而面试的方式则是通过考验面试者的能力和素质来筛选出合适的人选。 因此,在面试时,代码无错只是基本要求,更重要的是要展示自己的思考能力、解决问题的能力、学习能力等方面的优势。 2. 强化代码的可…

    Java 2023年5月23日
    00
  • Java使用反射操作数组示例

    Java反射是在程序运行时可以动态获取类的信息并操作类的属性、方法和构造器。在Java中,数组是一种特殊类型的对象,因此也可以使用反射操作数组。本文将讲述如何使用Java反射操作数组,包括获取数组信息、读取/修改数组元素、创建新数组等。 获取数组信息 要对数组进行反射操作,首先需要获取数组对象的所有信息,常用的方法有以下两种: // 获取数组类型 Strin…

    Java 2023年5月26日
    00
  • springboot实现全局异常处理及自定义异常类

    一、背景简介 在SpringBoot的应用开发过程中,异常处理显得尤为关键。当系统运行出现意外情况时,能够及时捕获异常、快速定位问题和提供友好的提示信息,是系统健壮性和用户体验的保障。本文将介绍如何使用SpringBoot实现全局异常处理并自定义异常类,帮助开发人员快速高效地处理异常信息。 二、目标 实现全局异常处理,处理系统的所有异常,包括运行时异常和非运…

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