Jackson HashMap,写入字符串时忽略地图名称
Jackson HashMap, ignore map name when writing to String
考虑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<>();
@JsonAnyGetter
public HashMap<String , PojoType1> pojoType1Getter(){
return map;
}
@JsonAnySetter
public 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 @Setter
private Type1 t1;
@Getter @Setter
private Type2 t2;
@Getter @Setter @JsonUnwrapped
private 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>>
@Json展开
似乎不适用于 HashMaps
Why I'm not able to unwrap and serialize a Java map using the Jackson Java library?
此处引用相关答案
@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')
将向地图添加一个新键 abc
,值为 xyz
。
Jackson 项目目前有一个 an open issue 以允许在地图上支持 @JsonUnwrapped
。它没有被标记为即将推出的 Jackson 2.10 或 3.x 版本,因此它看起来不像是在近期功能路线图上。
在支持此功能之前,使用 @JsonAnySetter
/@JsonAnyGetter
的解决方法似乎是可行的方法。
考虑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<>();
@JsonAnyGetter
public HashMap<String , PojoType1> pojoType1Getter(){
return map;
}
@JsonAnySetter
public 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 @Setter
private Type1 t1;
@Getter @Setter
private Type2 t2;
@Getter @Setter @JsonUnwrapped
private 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>>
@Json展开 似乎不适用于 HashMaps
Why I'm not able to unwrap and serialize a Java map using the Jackson Java library?
此处引用相关答案
@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')
将向地图添加一个新键 abc
,值为 xyz
。
Jackson 项目目前有一个 an open issue 以允许在地图上支持 @JsonUnwrapped
。它没有被标记为即将推出的 Jackson 2.10 或 3.x 版本,因此它看起来不像是在近期功能路线图上。
在支持此功能之前,使用 @JsonAnySetter
/@JsonAnyGetter
的解决方法似乎是可行的方法。