3分钟搞定Gson集合转换:从List到Map的避坑指南

3分钟搞定Gson集合转换:从List到Map的避坑指南

【免费下载链接】gson A Java serialization/deserialization library to convert Java Objects into JSON and back 【免费下载链接】gson 项目地址: https://gitcode.com/gh_mirrors/gs/gson

你是否还在为Java集合与JSON互转头疼?空指针异常、类型转换错误、泛型丢失...这些问题是不是经常让你加班到深夜?本文将通过3个实战场景,带你掌握Gson处理List、Map、Array的核心技巧,读完你将能够:

  • 解决90%的集合序列化异常
  • 掌握泛型类型正确传递方法
  • 优化复杂集合的转换性能

为什么选择Gson处理集合?

Gson作为Google官方的JSON处理库,在集合转换方面具有独特优势:

  • 无需手动编写映射代码
  • 内置丰富的TypeAdapter支持
  • 完美兼容Java泛型系统
  • 可扩展性强,支持自定义转换规则

项目核心实现位于gson/src/main/java/com/google/gson/Gson.java,其中集合处理的关键逻辑在gson/src/main/java/com/google/gson/internal/bind/CollectionTypeAdapterFactory.javagson/src/main/java/com/google/gson/internal/bind/MapTypeAdapterFactory.java

List集合的JSON转换实战

基础List转换

最常见的List 转换示例:

Gson gson = new Gson();
List<String> stringList = Arrays.asList("apple", "banana", "cherry");

// 序列化为JSON
String json = gson.toJson(stringList);
System.out.println(json); // ["apple","banana","cherry"]

// 从JSON反序列化
List<String> deserializedList = gson.fromJson(json, new TypeToken<List<String>>(){}.getType());

这里的关键是使用TypeToken来保留泛型信息,避免类型擦除导致的转换错误。相关测试案例可以参考gson/src/test/java/com/google/gson/functional/CollectionTest.java

复杂对象List转换

当List中包含自定义对象时,转换方式类似但需要注意对象的序列化规则:

class User {
    String name;
    int age;
    // 构造函数、getter和setter省略
}

List<User> userList = Arrays.asList(
    new User("Alice", 25),
    new User("Bob", 30)
);

// 序列化
String json = gson.toJson(userList);

// 反序列化
List<User> deserializedUsers = gson.fromJson(json, 
    new TypeToken<List<User>>(){}.getType());

如果需要自定义User类的序列化规则,可以使用@JsonAdapter注解或自定义TypeAdapter,具体实现可参考gson/src/main/java/com/google/gson/TypeAdapter.java

Map集合的高级转换技巧

Map基础转换

Map的转换与List类似,但需要注意键的类型限制:

Map<String, Integer> scoreMap = new HashMap<>();
scoreMap.put("Math", 90);
scoreMap.put("English", 85);

// 序列化
String json = gson.toJson(scoreMap);
// {"Math":90,"English":85}

// 反序列化
Map<String, Integer> deserializedMap = gson.fromJson(json,
    new TypeToken<Map<String, Integer>>(){}.getType());

复杂嵌套Map处理

对于嵌套Map结构,Gson同样可以轻松应对:

Map<String, Map<String, Object>> nestedMap = new HashMap<>();
Map<String, Object> userInfo = new HashMap<>();
userInfo.put("name", "Alice");
userInfo.put("scores", Arrays.asList(90, 85, 95));
nestedMap.put("user", userInfo);

String json = gson.toJson(nestedMap);
// {"user":{"name":"Alice","scores":[90,85,95]}}

Gson对Map的处理逻辑在gson/src/main/java/com/google/gson/internal/bind/MapTypeAdapterFactory.java中实现,支持多种Map实现类的转换。

数组与集合的混合转换

数组转换基础

数组转换比集合更简单,无需使用TypeToken:

String[] fruits = {"apple", "banana", "cherry"};
String json = gson.toJson(fruits);
// ["apple","banana","cherry"]

String[] deserializedArray = gson.fromJson(json, String[].class);

数组与集合的相互转换

Gson可以直接实现数组与集合的转换:

// 数组转List
String[] array = {"a", "b", "c"};
List<String> list = Arrays.asList(gson.fromJson(gson.toJson(array), String[].class));

// List转数组
List<Integer> numList = Arrays.asList(1, 2, 3);
Integer[] numArray = gson.fromJson(gson.toJson(numList), Integer[].class);

数组处理的核心代码在gson/src/main/java/com/google/gson/internal/bind/ArrayTypeAdapter.java中。

避坑指南:常见问题解决方案

泛型类型丢失问题

问题:直接使用List.class会导致泛型信息丢失

错误示例

// 错误方式 - 会导致类型转换异常
List<User> users = gson.fromJson(json, List.class);
User user = users.get(0); // ClassCastException: LinkedTreeMap cannot be cast to User

正确解决方案

// 使用TypeToken保留泛型信息
Type userListType = new TypeToken<List<User>>(){}.getType();
List<User> users = gson.fromJson(json, userListType);

空集合序列化问题

问题:默认情况下,空集合会被序列化为[]{}

解决方案:使用GsonBuilder配置空集合处理:

Gson gson = new GsonBuilder()
    .serializeNulls() // 序列化null值
    .create();

相关配置类在gson/src/main/java/com/google/gson/GsonBuilder.java中定义。

性能优化:处理大型集合

当处理包含 thousands 级元素的大型集合时,推荐使用流式处理:

// 大型集合序列化优化
try (FileWriter writer = new FileWriter("large_list.json")) {
    gson.toJson(largeList, new TypeToken<List<Data>>(){}.getType(), writer);
}

// 大型集合反序列化优化
try (FileReader reader = new FileReader("large_list.json")) {
    List<Data> dataList = gson.fromJson(reader, 
        new TypeToken<List<Data>>(){}.getType());
}

性能测试表明,流式处理比普通方式节省约40%的内存占用,具体测试数据可参考gson/src/test/java/com/google/gson/metrics/PerformanceTest.java

总结与进阶学习

通过本文的学习,你已经掌握了Gson处理List、Map、Array的核心技巧。想要进一步提升,可以学习:

Gson作为Java生态中最流行的JSON处理库,其强大的集合转换能力可以极大提高开发效率。掌握这些技巧,让你从此告别JSON转换的烦恼,写出更优雅、更高效的代码!

如果你有其他Gson使用技巧或问题,欢迎在评论区留言分享!

【免费下载链接】gson A Java serialization/deserialization library to convert Java Objects into JSON and back 【免费下载链接】gson 项目地址: https://gitcode.com/gh_mirrors/gs/gson

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值