如何使用Jackson解析不合格的JSON数组?

时间:2015-02-23 22:28:23

标签: java json serialization jackson

所以,我正在访问第三方API并且它给了我这个JSON对象,但我有一段时间的鲸鱼试图找到一种优雅的方法来解析资源子对象使用杰克逊。

我假设我必须编写一个自定义反序列化程序,尽管我想知道是否还有另一种方式...

{
    "somekey": "somevalue",
    "resources": [
        "list",
        [
            {
                "@type": "com.yada.Yada",
                "resource": {
                    "@type": "ServiceObjectReference",
                    "id": "emp1234",
                    "displayName": "Bob Smith"
                },
                "type": "TYPE_PERSON",
                "resourceType": 200
            },
           {
                "@type": "com.yada.Yada",
                "resource": {
                    "@type": "ServiceObjectReference",
                    "id": "emp1235",
                    "displayName": "Sue Smith"
                },
                "type": "TYPE_PERSON",
                "resourceType": 200
            }
       ]
   ]
}

3 个答案:

答案 0 :(得分:1)

由于资源的值是具有不同对象类型的数组,因此您可能不希望将POJO用于​​映射。不确定自定义反序列化器的实现,但是您可能希望使用ObjectMapper#readTree方法,而不是根据类型读取节点值

ObjectMapper mapper = new ObjectMapper();
JsonNode rootNode = mapper.readTree(your_json_input);

JsnoNode resourcesNode = rootNode.path("resources");

for (JsonNode resourceNode : resourcesNode ) {
    if (resourceNode.isObject()) {
        // the node is an object, you could do POJO mapping now or keep using path() method to go deeper
    } else {
        // simply get the String value
        String list = resourceNode.getTextValue();
    }
}

答案 1 :(得分:0)

看起来json的生产者使用多态类型处理。 我们都同意这不适用于公共场合。

但是,您可以尝试注释您的类,以便杰克逊可以使用它。

注释@JsonTypeInfo将是您的起点

它看起来像这样:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, visible = true)
@JsonSubTypes({
    @JsonSubTypes.Type(value = MyYada.class, name="com.yada.Yada")
})
public class MyYada

答案 2 :(得分:0)

我做了更多研究,看起来这是一个“双元素JSON数组”。它可以使用JsonTypeInfo.As(WRAPPER_ARRAY)

进行解析

http://jackson.codehaus.org/1.9.9/javadoc/org/codehaus/jackson/annotate/JsonTypeInfo.As.html#WRAPPER_ARRAY