Java Jackson解组自定义对象而不是LinkedHashMap
我有一个Java对象结果:Java Jackson解组自定义对象而不是LinkedHashMap,java,json,jackson,Java,Json,Jackson,我有一个Java对象结果: public class MetaData { private List<AttributeValue<String,Object>> properties private String name ... ... getters/setters ... } (顺便说一句:我使用GSON也尝试过同样的方法,但是对象是StringMap,问题也是一样的。使用GSON的解决方案也是受欢迎的) 编辑中有StaxMan
public class MetaData {
private List<AttributeValue<String,Object>> properties
private String name
...
... getters/setters ...
}
(顺便说一句:我使用GSON也尝试过同样的方法,但是对象是StringMap,问题也是一样的。使用GSON的解决方案也是受欢迎的)
编辑中有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);
pairpair=newpair(1,newpair(1,1));
ObjectMapper mapper=新的ObjectMapper();
String str=mapper.writeValueAsString(对);
Pair result=mapper.readValue(str,Pair.class);
如果没有enableDefaultTyping()
,我将拥有str={“k:1,v”:{“k:1,v:1}}
,它将与LinkedHashMap
反序列化为对
但是如果我在mapper
上启用DefaultTyping()
,那么str={“k”:1,v:[“Pair”,“k”:1,v”:1}}
会完美地反序列化到Pair
你检查过这个了吗:谢谢。是的,我做了,但这不是解决我问题的办法。元数据对象创建正确,并且有一个AttributeValue列表(在第一级)。问题是在第二个层次上,对象应该被另一个(嵌套的)AttributeValue替换。In StaxMan说:“LinkedHashMap只在类型信息丢失时返回(或者如果Object.class被定义为type)”,这似乎是原因,但我想覆盖这一点……你能给出一个要解析的JSON示例吗?看起来,AttributeValue
有一个嵌套的JSON对象(即,{}
),因为Jackson没有关于嵌套对象的任何类型信息,所以通用反序列化器开始工作。可以通过自定义序列化程序来解决这个问题,但这需要更多的工作,所以这里有一个JSON示例会有所帮助。谢谢@dhke,我在上面添加了一个JSON示例。从我所读到的内容来看,我认为这确实是一条路,但我真的不知道从哪里开始。谢谢@hotkey,我会试试的。但如果我理解正确,这意味着我必须将Java类写入JSON,这将使它们紧密结合在一起?@user3319803,是的,将类型信息包含在JSON中会将其绑定到某些类。但是绑定是可定制的:您可以更改Jackson类型,例如,在类上使用@JsonTypeInfo
,并更改映射器的类型。它有时可以帮助您进行动态/泛型类型反序列化,即使您无法控制序列化,例如,当您使用某些API时。@user3319803,顺便说一句,您可以将其作为介绍,尽管它是关于多态性反序列化的。感谢链接@hotkey。这似乎是一个很好的介绍,也是我问题的一个潜在解决方案。我希望我的JSON是这样的:str={“k:1”,v:{“k:1”,v:1}
我的JS前端不应该知道后端的类。@JsonTypeInfo似乎允许大量定制,但仍然保持这种耦合(如果我理解正确的话)。
{
"properties":[
{
"attribute":"creators",
"value":[
{
"attribute":"creator",
"value":"user1"
},{
"attribute":"creator",
"value":"user2"
}
]
},{
"attribute":"type",
"value": "question"
}
],
"name":"example"
}
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);