Java Jackson HashMap,写入字符串时忽略映射名称
考虑类似JSON的问题:Java Jackson HashMap,写入字符串时忽略映射名称,java,jackson,pojo,jackson-databind,Java,Jackson,Pojo,Jackson Databind,考虑类似JSON的问题: {"randomName1": { "knownfield1": "a", "knownfield2": [1,3,2,4] }, "randomName2": { "knownfield1": "0.20", "knownfield2": [1,2,3,4] } } 然后我试着把它写回Json,我必须调用它,它工作得很好 new ObjectMapper().writeValueAsString(pojo.getMap()); 现在
{"randomName1": {
"knownfield1": "a",
"knownfield2": [1,3,2,4]
},
"randomName2": {
"knownfield1": "0.20",
"knownfield2": [1,2,3,4]
}
}
然后我试着把它写回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;
}
预期结果将是一个类似于
{
"t1":{...},
"t2":{...},
"randomName1":{...},
"randomName2":{...},
...............
}
相反,它是
{
"t1":{...},
"t2":{...},
"pojoForMap":{
"map":{
"randomName1":{...},
...
}
}
}
如果我将pojoForMap更改为HashMap
我的问题是,如何在主POJO中序列化映射条目本身,而不使用任何字段名?过去我使用List来避免这种麻烦,忽略实际的列表名,但这是另一种情况,字段名未知
我试过使用List
,List
@JsonUnwrapped
在HashMaps上似乎不起作用
在此引述有关答案
@JsonUnwrapped
不适用于映射,只适用于具有getter和setter的适当POJO。对于地图,应使用和(在jackson版本>=1.6中提供)
在您的情况下,请尝试以下方法:
@JsonAnySetter
public void add(String key, String value) {
map.put(key, value);
}
@JsonAnyGetter
public Map<String,String> getMap() {
return map;
}
@jsonanystetter
公共void添加(字符串键、字符串值){
map.put(键、值);
}
@JsonAnyGetter
公共地图getMap(){
返回图;
}
这样,您还可以直接向映射添加属性,如add('abc','xyz')
将使用值xyz
向映射添加一个新键abc
目前,Jackson项目中有一个支持地图上的@JsonUnwrapped
。它没有被标记为即将发布的2.10或3.x版本的Jackson,因此它看起来不在近期功能路线图上
在支持此功能之前,使用
@JsonAnySetter
/@JsonAnyGetter
的解决方法似乎是可行的。是的,我已经找到了获得相同响应的方法。从映射中删除@Getter并使用HashMap在MainPojo中添加@JsonAnyGetter就达到了目的
{
"t1":{...},
"t2":{...},
"pojoForMap":{
"map":{
"randomName1":{...},
...
}
}
}
@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":{...},
........
}
}
}
@JsonAnySetter
public void add(String key, String value) {
map.put(key, value);
}
@JsonAnyGetter
public Map<String,String> getMap() {
return map;
}