为了账号安全,请及时绑定邮箱和手机立即绑定

Jackson HashMap,写入字符串时忽略地图名称

Jackson HashMap,写入字符串时忽略地图名称

人到中年有点甜 2023-05-10 13:31:55
考虑像这样的 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。对于地图,您应该使用@JsonAnyGetterand @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似乎是可行的方法。


查看完整回答
反对 回复 2023-05-10
  • 1 回答
  • 0 关注
  • 88 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信