gpt4 book ai didi

java - Jackson Unmarshall 自定义对象而不是 LinkedHashMap

转载 作者:搜寻专家 更新时间:2023-11-01 03:35:54 26 4
gpt4 key购买 nike

我有一个 Java 对象结果:

public class MetaData {
private List<AttributeValue<String,Object>> properties
private String name
...

... getters/setters ...
}

AttributeValue 类是一个通用的键值类。可能嵌套了不同的 AttributeValue。然后,(值)Object 将是另一个 AttributeValue 等等。

由于遗留原因,无法更改此对象的结构。

我有我的 JSON,我尝试将其映射到该对象。常规属性一切顺利。列表的第一层也填充了 AttributeValues。

问题是对象。 Jackson 不知道如何解释这种嵌套行为,只是将其设为 LinkedHashMap。

我正在寻找一种方法来实现自定义行为以告诉 Jackson 这必须是一个 AttributeValue 对象而不是 LinkedHashMap。

这就是我目前转换 JSON 的方式:

ObjectMapper om = new ObjectMapper();
MetaData metaData = om.readValue(jsonString, new TypeReference<MetaData>(){});

这是示例 JSON。 (这是通过将现有的 MetaData 对象序列化为 JSON 获得的,我可以完全控制这种语法)。

{
"properties":[
{
"attribute":"creators",
"value":[
{
"attribute":"creator",
"value":"user1"
},{
"attribute":"creator",
"value":"user2"
}
]
},{
"attribute":"type",
"value": "question"
}
],
"name":"example"
}

(顺便说一句:我已经使用 GSON 进行了相同的尝试,但是对象是一个 StringMap 并且问题是相同的。也欢迎使用 GSON 的解决方案)。

编辑Using Jackson ObjectMapper with Generics to POJO instead of LinkedHashMap StaxMan 有评论:“LinkedHashMap 仅在缺少类型信息时返回(或者如果 Object.class 被定义为类型)。

后者似乎是这里的问题。有什么方法可以覆盖它吗?

最佳答案

如果您可以控制序列化,请尝试调用 enableDefaultTyping()在你的映射器上。

考虑这个例子:

Pair<Integer, Pair<Integer, Integer>> pair = new Pair<>(1, new Pair<>(1, 1));
ObjectMapper mapper = new ObjectMapper();
String str = mapper.writeValueAsString(pair);
Pair result = mapper.readValue(str, Pair.class);

没有enableDefaultTyping() , 我会 str = {"k":1,"v":{"k":1,"v":1}}这将反序列化为 PairLinkedHashMap .

但如果我 enableDefaultTyping()mapper , 然后 str = {"k":1,"v":["Pair",{"k":1,"v":1}]}然后完美反序列化为 Pair<Integer, Pair<...>> .

关于java - Jackson Unmarshall 自定义对象而不是 LinkedHashMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31669517/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com