2017-04-27 121 views
1

我試圖用ObjectMapper一個POJO反序列化和即時得到錯誤:反序列化使用傑克遜ObjectMapper到POJO的<T>

No suitable constructor found for type [simple type, class LambdaResult<java.lang.Object>]: can not instantiate from JSON object (missing default constructor or creator, or perhaps need to add/enable type information?) 

我的POJO的很簡單

class LambdaResult<T> { 

     LambdaResult() {} 

     String Status 
     ArrayList<T> Results 
    } 

而且我反序列化的代碼是以下

static <T> T Deserialize(final TypeReference<T> type, 
            final String json) { 

      return new ObjectMapper().readValue(json, type) 
     } 


LambdaResult<Object> result = Serialization.Deserialize(new TypeReference<LambdaResult<Object>>() {},jsonResult) 

的Json例如:

{"status": "success", "locale": "sg", "results": [{"status": "pending"}]} 

我來自C#背景,所以這裏有一些我可能在這裏丟失的東西。

感謝

+0

你可以上傳你試圖反序列化的一些JSON嗎? – 2017-04-27 10:19:07

+0

這就是:{「status」:「success」,「locale」:「sg」,「results」:[{「status」:「pending」}]} –

+0

嘗試刪除空的構造函數或將其設置爲「public '。默認訪問器只允許同一個包中的類使用它。 – Henrik

回答

1

我會建議創建和配置ObjectMapper像這樣(Java的,對不起,不說話的Groovy):

ObjectMapper mapper = new ObjectMapper(); 
mapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true); 
mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY); 
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 

mapper在這種情況下,大概應該是在同一個類中的字段作爲Deserialize方法,將隨後的樣子:

return mapper.readValue(json, type); 

解釋配置:

  1. 這個MapperFeature告訴傑克遜以不區分大小寫的方式匹配字段名稱。所以它會發現String Status,雖然它不遵循Java Beans命名約定。在你的情況下,這很整齊,但是對於將字符串轉換爲小寫字符會帶來一些小的性能損失。您也可以使用@JsonProperty對類中的字段進行註釋,並指定所需的任何JSON字段名稱。
  2. 這告訴傑克遜將JSON fiels與Java對象字段匹配,而不管字段可見性如何private,public等。您也可以用@JsonAutoDetect註釋您的類,並指定其中的可見性。在這兩種情況下,您都不需要定義構造函數,但是如果您不希望它是公共的,則可以保留它。
  3. 最後一個告訴傑克遜在遇到JSON中不存在的字段時不會失敗。在這種情況下,"locale"
+0

感謝馬諾斯!實際上,在看到您的回覆之前,我已將FAIL_ON_UNKNOWN_PROPERTIES設置爲false,但不知何故,它並未反映我的更改。我不知道其他的,很好。謝謝 –