如何反序列化不同类型的 JSON 数组?

Posted

技术标签:

【中文标题】如何反序列化不同类型的 JSON 数组?【英文标题】:How to deserialize JSON array with different types? 【发布时间】:2022-01-19 14:56:02 【问题描述】:

我有一个这样的 JSON 数组:

[
  "0",
  
    "number": 1,
    "field": "value"
  ,
  
    "number": 2,
    "field": "value"
  
]

数组的第一个元素是一个字符串。

是否可以使用 FasterXML Jackson 对其进行反序列化?

我知道如何处理不同的对象。 我需要使用@JsonSubTypes(这里是一个例子https://***.com/a/38877862/2564509)

这个数组的问题是第一个元素是String类型的。

【问题讨论】:

我没有准备好对其进行测试,但与链接解决方案相比,我看到的“唯一”问题是 String 是最终的,不能用于扩展自定义接口。但是 1) 你真的需要一个单一的自定义界面(例如 List)吗? 2)如何创建一个包含 String 的 StringWrapper 类(可能使用自定义(De)Serializer?3)通过扩展非 final 和类似 String 的东西来作弊怎么样,例如一个 CharSequence 实现(遗憾的是,StringBuilder 也是最终的)? @GPI 是的,String 类是最终的。因此,我无法为 String 和其他类提供通用接口。 1)我从问题中的 API 获得一个数组。我无法改变它。 2)我没试过。所以这是下一个尝试。 3) 就我而言,这不是一个好方法,因为其他元素(对象)与字符串无关(它们更具体,如用户数据)。 我的错,在关闭时跳了枪。 【参考方案1】:

警告:你的情况是一个不幸的边缘情况。 因此, 解决方案可能并不完美。

这行得通, 但并不美妙:

    首先,反序列化为List<Object>。 在您的情况下,这将产生一个包含三个元素的列表; 细绳, LinkedHashMap, 和 LinkedHashMap 接下来,处理数组中的每个元素,然后, 基于元素类型的过程; 一个 String 将是你的 String 元素, LinkedHashMap 将代表您的数字字段类。

【讨论】:

以上是关于如何反序列化不同类型的 JSON 数组?的主要内容,如果未能解决你的问题,请参考以下文章

使用 kotlinx.serialization 库反序列化具有不同值类型的 JSON 数组

使用Jackson对JSON数组中存放不同对象反序列化

使用Jackson对JSON数组中存放不同对象反序列化

使用Jackson对JSON数组中存放不同对象反序列化

Json.NET:将嵌套数组反序列化为强类型对象

使用变量名数组反序列化 JSON