【问题标题】:Jackson deserializing hash map杰克逊反序列化哈希图
【发布时间】:2014-02-21 06:47:27
【问题描述】:

我有以下 JSON:

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

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

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

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

例如。

【问题讨论】:

标签: java jackson


【解决方案1】:

要反序列化为具体值的列表/集合(而不是您默认获得的 LinkedHashMap),您需要将类型信息传递给 Jackson:

mapper.readValue(jsonString, new TypeReference<List<MyHolder>>() { });

另一种方法是:

CollectionType javaType = mapper.getTypeFactory().constructCollectionType(List.class, MyHolder.class);
List<MyDto> asList = mapper.readValue(jsonString, javaType);

希望这会有所帮助。

【讨论】:

  • 这很好用。例如反序列化为 MapMap&lt;String, JsonBean&gt; myMap = mapper.readValue(json, new TypeReference&lt;Map&lt;String, JsonBean&gt;&gt;(){})
【解决方案2】:

您的 JSON 无效。假设 JSON 如下所示:

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

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

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
}

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

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

上面的程序打印:

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

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

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 类现在可能如下所示:

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
}

正如您在第二个示例中看到的那样,我们使用了@JsonDeserialize 注释,而我们不必使用@JsonProperty

【讨论】:

    猜你喜欢
    • 2012-01-11
    • 2015-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-19
    • 2016-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多