Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jackson解组自定义对象而不是LinkedHashMap_Java_Json_Jackson - Fatal编程技术网

Java Jackson解组自定义对象而不是LinkedHashMap

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

我有一个Java对象结果

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);