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日

相关文章

  • 利用Redis实现延时处理的方法实例

    关于如何利用Redis实现延时处理,可以采取以下步骤: 步骤1:安装和配置Redis 首先需要确保Redis服务器已经正确安装在本地或远程服务器上,并正确配置了Redis的相关参数。可以通过以下命令检查Redis服务器是否已安装: redis-cli ping 如果已经安装,会返回“PONG”字样。如果未安装,可以参考官方文档进行安装和配置:https://…

    Java 2023年5月26日
    00
  • JSP中使用JSTL按不同条件输出内容的方法

    下面我将详细讲解JSP中使用JSTL按不同条件输出内容的方法的完整攻略。 1. 什么是 JSTL? JavaServer Pages (JSP) 标准标记库(英文全称为:JavaServer Pages Standard Tag Library,简称为JSTL)是SUN公司内部开发的一套在JSP中使用的JSP标准标签库,它封装了JSP应用的通用核心功能,便于…

    Java 2023年6月15日
    00
  • Java Springboot全局异常处理

    Java Spring Boot 是一个快速开发框架,可以帮助我们快速构建稳定高效的应用程序。在开发应用程序时,往往需要处理一些在运行期间可能发生的异常错误。为了使应用程序更加健壮与可靠,我们需要进行全局异常处理。 一、为什么需要全局异常处理 全局异常处理在应用中非常重要,主要有以下几个原因: 增强用户体验:当应用程序出现异常时,我们可以通过全局异常处理机制…

    Java 2023年5月19日
    00
  • Java获取项目路径的多种方式

    获取Java Web项目路径是Java Web应用程序开发中的一个常见需求,以下是Java获取项目路径的多种方式: 使用getClassLoader获取项目路径 可以通过Thread.currentThread().getContextClassLoader().getResource(“”)来获取classpath下的路径 String path = Th…

    Java 2023年5月20日
    00
  • SpringBoot获取前台参数的六种方式以及统一响应

    我们来详细讲解一下 Spring Boot 获取前台参数的六种方式以及统一响应方案。 获取前台参数的六种方式 1. RequestParam 方式 RequestParam 方式是通过 HttpServletRequest 的 getParameter() 方法来获取前台请求传来的参数值的方式。使用 @RequestParam 注解即可实现。 @Reques…

    Java 2023年5月20日
    00
  • SpringMVC框架整合Junit进行单元测试(案例详解)

    SpringMVC框架整合Junit进行单元测试(案例详解) 在 SpringMVC 中,我们可以使用 Junit 进行单元测试。本文将详细讲解 SpringMVC 框架整合 Junit 进行单元测试的完整攻略,包括如何配置 SpringMVC、如何使用 Junit 进行单元测试、如何编写测试用例等。 配置 SpringMVC 在使用 Junit 进行单元测…

    Java 2023年5月18日
    00
  • SpringData Repository Bean方法定义规范代码实例

    下面是SpringData Repository Bean方法定义规范的完整攻略。 什么是Spring Data Repository Bean? Spring Data是Spring框架提供的一个子项目,它为各种数据存储技术提供了统一的访问方式。Spring Data Repository是Spring Data中最核心的组件之一,它提供了一种声明式的方式…

    Java 2023年5月20日
    00
  • SpringBoot2.x中management.security.enabled=false无效的解决

    问题描述: 在使用 Spring Boot 2.x 项目时,当添加了 Actuator 组件后,如果需要关闭 Actuator 组件的安全认证功能,通过在配置文件中加入 management.security.enabled=false 进行了配置,但是访问 Actuator 的端点时,仍然需要输入用户名和密码进行认证。 解决方法: Spring Boot …

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