gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:32:08 25 4
gpt4 key购买 nike

考虑像这样的 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似乎不适用于 HashMap

最佳答案

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

在此引用相关答案

@JsonUnwrapped 不适用于映射,仅适用于具有 getter 和 setter 的正确 POJO。对于 map ,您应该使用@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;
}

这样,您也可以直接向 map 添加属性,例如 add('abc','xyz') 会向 map 添加一个新的键 abc值为xyz

目前有一个an open issue Jackson 项目允许在 map 上支持 @JsonUnwrapped。它没有被标记为出现在即将推出的 Jackson 2.10 或 3.x 版本中,因此它看起来并不在近期功能路线图上。

在支持此功能之前,使用 @JsonAnySetter/@JsonAnyGetter 的解决方法似乎是可行的方法。

关于java - Jackson HashMap,写入字符串时忽略映射名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57312679/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com