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
您的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);
希望这可以帮助。