考慮像這樣的 JSON:{"randomName1": { "knownfield1": "a", "knownfield2": [1,3,2,4]},"randomName2": { "knownfield1": "0.20", "knownfield2": [1,2,3,4]}}public class PojoForJson {HashMap<String, PojoType1> map = new HashMap<>();@JsonAnyGetterpublic HashMap<String , PojoType1> pojoType1Getter(){ return map;}@JsonAnySetterpublic void pojoType1Setter(String key, PojoType1 value){ map.put(key,value);}}如果我有PojoForJson pojo = new ObjectMapper().readValue(jsonInput,PojoForJson.class);然后我試著把它寫回 Json,我必須打電話,它工作正常。new ObjectMapper().writeValueAsString(pojo.getMap());現(xiàn)在,這是另一個 POJO 中的一個字段,我們稱它為 PojoMain:@Builder public class PojoMain {@Getter @Setterprivate Type1 t1;@Getter @Setterprivate Type2 t2;@Getter @Setter @JsonUnwrappedprivate PojoForMap pojoForMap;}預(yù)期結(jié)果將是一個 JSON 看起來像 { "t1":{...}, "t2":{...}, "randomName1":{...}, "randomName2":{...}, ............... }相反,它是{ "t1":{...}, "t2":{...}, "pojoForMap":{ "map":{ "randomName1":{...}, ... } } }如果我將 pojoForMap 更改為HashMap<String, PojoType1>@Builder public class PojoMain { @Getter @Setter private Type1 t1; @Getter @Setter private Type2 t2; @Getter @Setter @JsonUnwrapped private HashMap<String, PojoType1> pojoForMap; }我仍然得到:{ "t1":{...}, "t2":{...}, "pojoForMap":{ "randomName1":{...}, ........ } } }我的問題是,我怎樣才能在沒有任何字段名稱的情況下在主 POJO 中自己序列化映射條目?我過去曾使用 List 來放棄這種麻煩并忽略實際的列表名稱,但這是一種不同的情況,其中字段名稱是未知的。我試過使用List<Map.Entry<String, PojoType1>>,List<Pair<String, PojoType1>>@JsonUnwrapped 似乎不適用于 HashMaps
1 回答

RISEBY
TA貢獻1856條經(jīng)驗 獲得超5個贊
@JsonUnwrapped
不適用于地圖,僅適用于具有 getter 和 setter 的適當(dāng) POJO。對于地圖,您應(yīng)該使用@JsonAnyGetter
and?@JsonAnySetter
(在 jackson 版本 >= 1.6 中可用)。
在你的情況下,試試這個:
@JsonAnySetter?
public void add(String key, String value) {
? ? map.put(key, value);
}
@JsonAnyGetter
public Map<String,String> getMap() {
? ? return map;
}
這樣,您也可以直接向地圖添加屬性,例如add('abc','xyz')
將使用 value 添加新鍵abc
到地圖xyz
。
Jackson 項目目前有一個未解決的問題@JsonUnwrapped
,以允許在地圖上提供支持。它沒有被標(biāo)記為即將推出的 Jackson 2.10 或 3.x 版本,因此它看起來不像是在近期功能路線圖上。
在支持此功能之前,使用@JsonAnySetter
/的解決方法@JsonAnyGetter
似乎是可行的方法。
添加回答
舉報
0/150
提交
取消