【问题标题】:Jackson HashMap, ignore map name when writing to StringJackson HashMap,写入字符串时忽略地图名称
【发布时间】:2019-12-10 06:24:31
【问题描述】:

考虑像这样的 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&lt;String, PojoType1&gt;

@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&lt;Map.Entry&lt;String, PojoType1&gt;&gt;List&lt;Pair&lt;String, PojoType1&gt;&gt;

@JsonUnwrapped 似乎不适用于 HashMaps

【问题讨论】:

    标签: java jackson pojo jackson-databind


    【解决方案1】:

    Why I'm not able to unwrap and serialize a Java map using the Jackson Java library?

    在此引用相关答案

    @JsonUnwrapped 不适用于地图,仅适用于带有 getter 和 setter 的适当 POJO。对于地图,您应该使用 @JsonAnyGetter@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 的解决方法似乎是可行的方法。

    【讨论】:

    • 是的,我设法找到了相同的响应方式。从地图中删除 @Getter 并使用 HashMap 在 MainPojo 中添加 @JsonAnyGetter 就可以了
    猜你喜欢
    • 2019-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-11
    • 1970-01-01
    • 2020-09-07
    相关资源
    最近更新 更多