考虑像这样的 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());现在,这是另一个 POJO 中的一个字段,我们称它为 PojoMain:@Builder public class PojoMain {@Getter @Setterprivate Type1 t1;@Getter @Setterprivate Type2 t2;@Getter @Setter @JsonUnwrappedprivate PojoForMap pojoForMap;}预期结果将是一个 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条经验 获得超5个赞
@JsonUnwrapped
不适用于地图,仅适用于具有 getter 和 setter 的适当 POJO。对于地图,您应该使用@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
,以允许在地图上提供支持。它没有被标记为即将推出的 Jackson 2.10 或 3.x 版本,因此它看起来不像是在近期功能路线图上。
在支持此功能之前,使用@JsonAnySetter
/的解决方法@JsonAnyGetter
似乎是可行的方法。
添加回答
举报
0/150
提交
取消