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

How can I parse an unqualified JSON array using Jackson?

所以,我正在访问第三方 API,它给了我这个 JSON 对象,但我花了很多时间试图找到一种优雅的方法来解析使用 Jackson 的资源子对象。

我假设我必须编写自定义解串器,但我想知道是否还有其他方法...

{
    "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
            }
       ]
   ]
}

由于资源的值是一个具有不同对象类型的数组,您可能不想使用 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();
    }
}

看起来 json 的生产者使用了多态类型处理。 我们都同意这不是在 public api.

中使用的东西

但是,您可以尝试注释您的 类 以便 jackson 可以利用它。

注释 @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 元素 JSON 数组”。可以使用JsonTypeInfo.As(WRAPPER_ARRAY)

解析

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