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

Java 如何使用Jackson解析不合格的JSON数组?,java,json,serialization,jackson,Java,Json,Serialization,Jackson,所以,我正在访问一个第三方API,它给了我这个JSON对象,但是我花了很多时间试图找到一种优雅的方法来使用Jackson解析resources子对象 我假设我必须编写一个自定义反序列化程序,尽管我想知道是否有其他方法 { "somekey": "somevalue", "resources": [ "list", [ { "@type": "com.yada.Yada",

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

我假设我必须编写一个自定义反序列化程序,尽管我想知道是否有其他方法

{
    "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的生产者似乎使用多态类型处理。 我们都同意,这不是在公共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(包装器数组)解析它


您有不平衡的开放式括号;希望JSON中不存在这种情况?抱歉,我不想发送整个JSON消息,所以我做了一个仓促的剪切粘贴工作。现在语法正确了。告诉我们你是如何遇到问题的,你做了什么尝试。使用JacksonBean注释,这非常简单。到目前为止,我所做的是创建映射到键/值对的POJO。我创建了一个类,其中包含一个字符串来保存“somekey”的值,另一个对象来保存“resources”,但是如果仔细观察,您会发现resources数组中的第一项是字符串,第二项是另一个缺少键的数组。我想知道如何得到这些值。杰克逊不知道怎么处理。。。我不知道如何在不使用在单个节点上执行.get()的自定义反序列化程序的情况下访问这些值。我遗漏了什么?我现在创建了一个自定义反序列化程序,但我希望有一个我不知道的更优雅的解决方案…我的自定义反序列化程序会按照这些思路做一些事情。它遍历“resources”节点的内容,如果遇到数组对象,我将尝试将其内容映射到POJO。其他所有内容(即“列表”对象)都将被忽略。无论是谁提出了这个语法作为我查询的RESTAPI返回的消息的一部分,都需要用橡皮软管打败他。:)是的,我已经实现了处理类型映射的类。那是小菜一碟。似乎编写这些API的人都不明白,由于未能在为所有对象创建密钥方面保持一致,这些API造成了多大的伤害。