Java Jackson HashMap,写入字符串时忽略映射名称

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()); 现在

考虑类似JSON的问题:

{"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;
}