Java:Json使用重复键来使用Jackson进行映射

时间:2014-12-30 18:19:24

标签: java json hashmap jackson

我有一个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文件中的所有数据。

无论如何要实现这个目标?

2 个答案:

答案 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);