杰克逊反序列化哈希映射 [英] Jackson deserializing hash map

查看:133
本文介绍了杰克逊反序列化哈希映射的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下JSON:

"propertyName": "{"1":[{"1":"value1","2":"value2","3":false}]}"

第一个属性是具有属性映射后数组中项目的计数。

the first property being the count of items in the array following having a map of properties.

如果我想要使用Jackson
反序列化它的最佳方法是什么填写一个包含这些值的类:

What is the best way to deserialize this using Jackson if I want to fill up a class holding these values:

class MyHolder
{
   name = "value1";
   age = "value2";
   female = false;
}

例如。

推荐答案

您的JSON无效。假设JSON看起来像这样:

Your JSON is not valid. Let assume that JSON looks like this:

{
   "propertyName":{
      "1":[
         {
            "1":"value1",
            "2":"value2",
            "3":false
         }
      ]
   }
}

最简单的方法是创建适合您的POJO类JSON。例如:

The simplest way is to create POJO classes which fit to your JSON. For example:

class Root {

    private Map<String, List<MyHolder>> propertyName;

    //getters,setters,toString
}

class MyHolder {

    @JsonProperty("1")
    private String name;
    @JsonProperty("2")
    private String age;
    @JsonProperty("3")
    private boolean female;

    //getters,setters,toString
}

现在我们可以通过这种方式轻松反序列化:

Now we can easily deserialize it in this way:

ObjectMapper mapper = new ObjectMapper();
System.out.println(mapper.readValue("{.. json ...}", Root.class));

以上程序打印:

Root [propertyName={1=[MyHolder [name=value1, age=value2, female=false]]}]

如果我们不希望在POJO类中看到 Map ,我们必须编写自定义转换器:

If we do not want to see Map in our POJO class we have to write custom converter:

class MapMyHolderConverter implements Converter<Map<String, List<Map<String, Object>>>, List<MyHolder>> {

    @Override
    public JavaType getInputType(TypeFactory typeFactory) {
        return typeFactory.constructMapType(Map.class, String.class, List.class);
    }

    @Override
    public JavaType getOutputType(TypeFactory typeFactory) {
        return typeFactory.constructCollectionType(List.class, MyHolder.class);
    }

    @Override
    public List<MyHolder> convert(Map<String, List<Map<String, Object>>> map) {
        Collection<List<Map<String, Object>>> values = map.values();
        if (values.isEmpty()) {
            return Collections.emptyList();
        }

        List<MyHolder> result = new ArrayList<>();
        for (Map<String, Object> item : values.iterator().next()) {
            MyHolder holder = new MyHolder();
            holder.setName(item.get("1").toString());
            holder.setAge(item.get("2").toString());
            holder.setFemale((Boolean) item.get("3"));
            result.add(holder);
        }

        return result;
    }
}

您的POJO课程现在看起来像这样:

Your POJO classes could look like this now:

class Root {

    @JsonDeserialize(converter = MapMyHolderConverter.class)
    private List<MyHolder> propertyName;

    //getters,setters,toString
}

class MyHolder {

    private String name;
    private String age;
    private boolean female;

    //getters,setters,toString
}

As你可以在第二个例子中看到我们正在使用 @JsonDeserialize 注释,我们不能使用 @JsonProperty

As you can see in second example we are using @JsonDeserialize annotation and we have not to use @JsonProperty.

这篇关于杰克逊反序列化哈希映射的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆