java使用Jackson将JSON反序列化为异构元素列表
在我的JSON中,我有一个包含以下内容的元素:
{
...
"locations": [
[
{
"location_type": "permanent",
"position": "at",
"accuracy": "exact"
},
"and",
{
"location_type": "permanent",
"position": "in",
"accuracy": "exact"
}
],
"or",
{
"location_type": "temporary",
"position": "at",
"accuracy": "exact"
}
],
...
}
如图所示,locations
的元素可以是:
- 地点
- 逻辑运算符
- 位置列表(允许复杂位置)
我得到的是“无法从START\u数组令牌中反序列化com.example.processor.transformation.json.Location
的实例”
如何使用Jackson将其转换为数据结构强>
到目前为止,我尝试的是:
- 提供
Location(String logicalOperator)
构造函数有助于平面列表的情况。(我基本上将运算符转换为一个特殊值^{)李> - 添加
Location(List<Location> subLocations)
或Location(Location[] subLocations)
构造函数对这种情况没有帮助李> - 添加
注意:我无法控制JSON格式,因此无法以更友好的方式对其进行编码
# 1 楼答案
你需要一个自定义的反序列化程序。你不能只添加一个构造函数
下面是一个包含类
Foo
的自包含示例,它可以由自己的属性"foo" : "someString"
或一些逻辑运算符"and"
或"or"
等表示为String
文字,旨在表示Foo
实例,其foo
属性将是该文字的值这可能完全适合您的情况,也可能不适合您的情况,但您可以进行调整
换句话说:
{"foo": "a"}
>new Foo("a")
"or"
>new Foo("or")
示例
//和自定义反序列化程序
输出
为清晰起见,请注意
这是一个非常简单的例子。 在你的例子中,你可能会想要一个多态的
Location
pojo集合与LogicalOperator
pojo(或类似的东西)混合,共享一个共同的标记接口。 然后,您可以根据JSON节点是以内容为特征(即位置)还是JSON节点是其内容(例如逻辑运算符)来决定反序列化哪个对象