2015-02-23 69 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