jackson反序列化哈希映射

我有以下JSON:

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

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

如果我想填写一个包含这些值的类,那么使用Jackson对此进行反序列化的最佳方法是:

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

例如。

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

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

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

 class Root { private Map> 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>>, List> { @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 convert(Map>> map) { Collection>> values = map.values(); if (values.isEmpty()) { return Collections.emptyList(); } List result = new ArrayList<>(); for (Map 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 propertyName; //getters,setters,toString } class MyHolder { private String name; private String age; private boolean female; //getters,setters,toString } 

正如您在第二个示例中所看到的,我们使用的是@JsonDeserialize注释,我们不能使用@JsonProperty

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

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

另一种方法是:

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

希望这可以帮助。