java - Json字符串反序列化为复杂的Java对象

标签 java json deserialization gson

我有这样的对象结构:

class A {
    List<B> bees;
}

class B {
    String с;
}

我正在使用 Gson 解析器,它将此类对象序列化为该字符串:

{"a":{"bees":[{"с":"text"}]}}

(添加根元素“a”)

API 的格式有点不同:

{"a":{"bees":[{"b":{"с":"text"}}]}}

我需要能够正确地将这些字符串解析为 A 对象。

默认情况下,B 对象(作为 A 的一部分)不是 null,而是空(所有字段都为 null),这是可以理解的,因为解析器在其中找不到任何字段“b”(当它实际上是类名时)。

我正在寻找一个通用的解决方案,我有很多这样复杂的对象,我不想为每个对象实现许多自定义反序列化器。

Gson不是必需的,如果需要我可以使用另一个库。

谢谢。

最佳答案

我更喜欢 Jackson Tree Model 和 JDK 8 Stream 来解析这样的 json 字符串,其核心思想是通过函数式 map() API 将 bees 数组元素 {"b":{"с":"text"}} 映射到 {"с":"text"}

ObjectMapper mapper = new ObjectMapper();
JsonNode beesNode = mapper.readTree(jsonString).get("a").get("bees");
List<JsonNode> bs = StreamSupport.stream(beesNode.spliterator(), false)
                    .map(bee -> bee.get("b")).collect(Collectors.toList());

关于java - Json字符串反序列化为复杂的Java对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20783426/

相关文章:

java - 为什么我的服务器/客户端聊天室程序中会出现这些错误?

java - 使用 Jackson 解压缩时出现 json 解析器异常

c# - 反序列化的ServiceStack时间

java - 如何在 Hazelcast 中找到命名空间的数量?

java - 生成随机长用户 ID

python - 有没有更好的方法来覆盖 Marshmallow.fields.List?

json - 将嵌套字典合并到 d3 sunburst 的 Json 文件

android - 包裹中 `createTypedArrayList()`和 `readTypedList()`的区别

java - 如何使用 xStream 反序列化多个对象

Class.forName() 重载版本的 Java 用例