2016-02-05 66 views
0

我想反序列化使用傑克遜2與RestAssured(IT測試的Java工具)的JSON字符串。傑克遜unmarshalling問題

我有一個問題。我試圖反序列化的字符串是:

{"Medium":{"uuid":"2","estimatedWaitTime":0,"status":"OPEN_AVAILABLE","name":"Chat","type":"CHAT"}} 

字符串開頭處有對象類型「Medium」。這導致傑克遜反序列化過程失敗:

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "Medium" 

我已經設置了「IGNORE_ON_UNKNOWN_PROPERTIES」爲false,然後我deserialisation期間也不例外。但是,我的所有屬性在java中都是'null'。

Response getAvailability -> {"Medium":{"uuid":"2","estimatedWaitTime":0,"status":"OPEN_AVAILABLE","name":"Chat","type":"CHAT"}} 
@@@ MEDIUM name -> null 
@@@ MEDIUM uuid -> null 
@@@ MEDIUM wait time -> null 
@@@ MEDIUM wait time -> null 
@@@ MEDIUM status -> null 

有人能幫助我嗎? (注意:我無法更改我的輸入JSON字符串)。

回答

1

你需要把註釋 @JsonRootName( 「中等」) 在bean類和配置對象映射到 mapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE)。

2
{ 
    "Medium": { 
     "uuid": "2", 
     "estimatedWaitTime": 0, 
     "status": "OPEN_AVAILABLE", 
     "name": "Chat", 
     "type": "CHAT" 
    } 
} 

正如你可以看到的uuid和其他params是媒體對象的一部分,所以它可以被反序列化的類是。

class Medium 
{ 
    string name; 
    // specify other params also. 
} 

class BaseObject 
{ 
    Medium Medium; 
} 

然後用jackson.deserialize('json', BaseObject.class)

上面我給了僞碼

0

您需要一種方法來刪除是輸入JSON的部分對象名稱。由於您無法更改輸入字符串,請使用此代碼將此輸入字符串更改爲樹並獲取「中」節點的值。

ObjectMapper m = new ObjectMapper(); 
JsonNode root = m.readTree("{\"Medium\":{\"uuid\":\"2\",\"estimatedWaitTime\":0,\"status\":\"OPEN_AVAILABLE\",\"name\":\"Chat\",\"type\":\"CHAT\"}}"); 
JsonNode obj = root.get("Medium"); 
Medium medium = m.readValue(obj.asText, Medium.class);