2015-02-23 44 views
2

因此,我正在访问第三方API,它给了我这个JSON对象,但我有一段时间试图找到一种使用Jackson解析资源子对象的优雅方法。如何使用Jackson解析一个不合格的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 
      } 
     ] 
    ] 
} 
+0

你有不平衡开括号进行解析;希望这在JSON中不存在...? – 2015-02-23 22:44:49

+0

对不起,不想发送整个JSON消息,所以我做了一个匆忙的剪切和粘贴工作。现在在语法上是正确的。 – bitstream 2015-02-23 23:09:32

+0

向我们展示您的问题以及您尝试的方式。用杰克逊豆的说法,这很简单。 – 2015-02-23 23:32:01

回答

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(); 
    } 
} 
+0

我的自定义解串器做了一些沿着这些线。它遍历“resources”节点的内容,如果它遇到一个数组对象,我试图将其内容映射到POJO。其他所有内容(即“列表”对象)将被忽略。 无论谁想出这种语法作为从Rest API回来的消息的一部分,我正在查询需要用橡胶软管殴打。 :) – bitstream 2015-02-24 01:23:48

0

它看起来像JSON的制作者使用多态类型的处理节点值。 我们都同意这不是公共API中使用的东西。

但是,你可以尝试注释你的类,使杰克逊可以利用这一点,虽然。

注释@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 
+0

是的,我已经实现了类来处理类型映射。这是一块蛋糕。看起来像编写这些API的人不明白他们在创建所有对象的密钥方面未能保持一致所造成的伤害。 – bitstream 2015-02-25 14:40:19