我有一个json文件,其密钥相同但值不同,如下所示,
{
"domains" : {
"A" : {
"name" : "a",
"type" : "a1"
},
"B" :{
"name" : "r",
"type" : "g1"
},
"A" : {
"name" : "b",
"type" : "b1"
}
}
}
来自外部系统。 如何将 json转换为java map 对象并访问键的不同值:A
我正在使用下面的内容,
map = mapper.readValue(json, new TypeReference<HashMap<String,String>>(){});
返回带有唯一键的地图。但我需要一个map对象来保存json文件中的所有数据。
无论如何要实现这个目标?
答案 0 :(得分:2)
我同意@fge的评论。
但是如果你真的坚持要解决这个问题,你可以将HashMap
(或任何其他Map
)子类化,覆盖其put
方法,并使用你想要的任何机制处理重复项。只需确保您的Map
具有无参数构造函数。
Guava也可能有一个数据类型,允许保留重复项(Multimap
?)。如果是这样,您将需要使用Jackson的Guava模块:https://github.com/FasterXML/jackson-datatype-guava
答案 1 :(得分:0)
自related question被标记为重复以来进行了回答,但似乎解决了以下反向问题:需要创建具有重复密钥的JSON。这就是Java模型->具有重复键的JSON。
我发现的最简单的方法是实现custom serializer。
public class CustomSerializer extends StdSerializer<ModelToSerialize> {
public CustomSerializer(Class<ModelToSerialize> t) {
super(t);
}
@Override
public void serialize(ModelToSerialize value, com.fasterxml.jackson.core.JsonGenerator gen, SerializerProvider provider) throws IOException {
gen.writeStartObject();
gen.writeStringField("DuplicateJsonKey", value.getDup1());
gen.writeStringField("DuplicateJsonKey", value.getDup2());
// Map all other values on value that you want to be present in the JSON
gen.writeEndObject();
}
}
然后当您进行序列化时:
SimpleModule simpleModule = new SimpleModule();
simpleModule.addSerializer(ModelToSerialize.class, new CustomSerializer(ModelToSerialize.class));
objectMapper.registerModule(simpleModule);
String sr = objectMapper.writeValueAsString(modelToSerialize);