2017-08-04 77 views
8

使用傑克遜的Java對象轉換成JSON傑克遜Java來JSON對象映射器修改字段的名稱

ObjectMapper mapper = new ObjectMapper(); 
mapper.setSerializationInclusion(Include.NON_NULL); 
jsonMessage = mapper.writeValueAsString(object); 

的結果是場「參與者」(它是對象實例的一部分)

participants Arrays$ArrayList<E> 

被重新命名爲 「participantsList」

participantsList":[{"userId":"c1f9c"}] 

即 「列表」 追加到字段名。我瀏覽了傑克遜的文檔,但沒有找到預防這種情況發生的方法。這可能嗎?在獨立項目中測試上述代碼不會導致相同的結果(即不發生重命名)。傑克遜爲什麼這樣做?不幸的是,該對象是第三方,我不能改變它。

使用傑克遜版本2.3.3(用2.9.0驗證相同的行爲)。

+0

什麼是消息對象? –

+0

作爲writeValueAsString()的參數傳遞的實例。它是第三方對象,因此在那裏可以做的不多。 – heeboir

+0

如果它是第三方對象,那麼您應該創建一個您控制序列化的模型。然後,您將轉換第三方對象並序列化爲JSON。這樣你就能夠註釋所有的屬性來滿足你內心的渴望。 – icirellik

回答

4

Oleksandr的評論指出了正確的方向。事實上,在確定JSON字段名稱時,Jackson似乎會考慮getParticipantsList()。但是,正如我之前寫的,考慮到它是第三方對象,我無法在其中進行任何更改。

但是,更好地瞭解是什麼原因導致的問題,我能想出了一個解決方案:

mapper.setVisibilityChecker(mapper.getVisibilityChecker().withFieldVisibility(Visibility.ANY).withGetterVisibility(Visibility.NONE).withIsGetterVisibility(Visibility.NONE)); 

mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY); 
mapper.setVisibility(PropertyAccessor.GETTER, Visibility.NONE); 
mapper.setVisibility(PropertyAccessor.IS_GETTER, Visibility.NONE); 
+2

你並沒有使用傑克遜2.6+,所以這個評論並不關心你,但也許對其他人來說:setVisibilityChecker從2.6開始已被棄用。您必須改用setVisibility。 http://fasterxml.github.io/jackson-databind/javadoc/2.9/com/fasterxml/jackson/databind/ObjectMapper.html#setVisibilityChecker(com.fasterxml.jackson.databind.introspect.VisibilityChecker) –

+1

@JuniorDussouillez我居然只是爲了同樣的目的編輯我的答案!我剛剛在稍後的版本中發現了這種棄用。無論如何,謝謝你指出! – heeboir

+0

只是爲了澄清,你的對象有不匹配的字段和getter命名(和傑克遜默認爲getter名稱)? – AjahnCharles

-1

也許你可以使用USE_ANNOTATIONS跳過像註釋這個:

ObjectMapper mapper = new ObjectMapper(); 
    mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); 
    mapper.configure(MapperFeature.USE_ANNOTATIONS, false); 
    String jsonMessage = mapper.writeValueAsString(object); 
+0

這沒有預期的效果; 「列表」後綴仍然會被追加。 – heeboir