Java:Json,具有使用Jackson映射的重复键

Java:Json,具有使用Jackson映射的重复键,java,json,hashmap,jackson,Java,Json,Hashmap,Jackson,我有一个json文件,具有相同的键,但值不同,如下所示 { "domains" : { "A" : { "name" : "a", "type" : "a1" }, "B" :{ "name" : "r", "type" : "g1" }, "A" : { "name" : "b",

我有一个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=mapper.readValue(json,newTypeReference(){});
它返回具有唯一键的映射。但是我需要一个map对象来保存json文件中的所有数据


无论如何要达到这个目的?

我同意@fge的评论

但是,如果您真的坚持要解决这个问题,您可以使用子类
HashMap
(或任何其他
Map
),重写其
put
方法,并使用您想要的任何机制来处理重复项。只需确保您的
映射
具有无参数构造函数

番石榴也可能有一个允许保留重复数据的数据类型(
Multimap
?)。如果是这样,您将希望使用Jackson的Guava模块:

应答,因为a标记为重复,但似乎解决了需要创建具有重复键的JSON的相反问题。这就是带有重复键的Java模型->JSON

我找到的最简单的方法是实现一个


解析此类JSON的结果“根据定义”是未定义的;使用Jackson实现这一点的唯一方法是自己解析它(实例化一个
JsonParser
;并逐个读取令牌)。然而,首先,你应该用大锤敲打JSON的制作人,告诉他/她去读RFC 7159。顺便说一下,相关文本::“当对象中的名称不唯一时,接收此类对象的软件的行为是不可预测的。”实际上,对于番石榴,有一个更简单的方法:使用
ForwardingMap
。当然,这并不能阻止JSON一开始就被破坏的事实。
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);