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

考虑像这样的 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>>


@JsonUnwrapped 似乎不适用于 HashMaps


人到中年有点甜
浏览 89回答 1
1回答

RISEBY

@JsonUnwrapped不适用于地图,仅适用于具有 getter 和 setter 的适当 POJO。对于地图,您应该使用@JsonAnyGetterand @JsonAnySetter(在 jackson 版本 >= 1.6 中可用)。在你的情况下,试试这个:@JsonAnySetter public void add(String key, String value) {    map.put(key, value);}@JsonAnyGetterpublic Map<String,String> getMap() {    return map;}这样,您也可以直接向地图添加属性,例如add('abc','xyz')将使用 value 添加新键abc到地图xyz。Jackson 项目目前有一个未解决的问题@JsonUnwrapped,以允许在地图上提供支持。它没有被标记为即将推出的 Jackson 2.10 或 3.x 版本,因此它看起来不像是在近期功能路线图上。在支持此功能之前,使用@JsonAnySetter/的解决方法@JsonAnyGetter似乎是可行的方法。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java