Java/Jackson: Deserialize JSON into class with HashMap
我想反序列化以下JSON输入:
1 2 3 4 | { "key1":"value1", "key2":"value2" } |
放入包含哈希映射的类对象中:
1 2 3 4 5 6 7 8 9 10 11 12 |
执行
时
1 | ClassContainingMap m = objectMapper.readValue(json, ClassContaininMap.class); |
我得到
1 2 3 4 5 6 7 8 9 10 11 12 13 | com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of test.ClassContainingMap: no Stri ng-argument constructor/factory method to deserialize from String value ('key1') at [Source:"key1":"value1","key2":"value2"; line: 1, column: 1] at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:270) at com.fasterxml.jackson.databind.DeserializationContext.instantiationException(DeserializationContext.java:1456) at com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1012) at com.fasterxml.jackson.databind.deser.ValueInstantiator._createFromStringFallbacks(ValueInstantiator.java:370) at com.fasterxml.jackson.databind.deser.std.StdValueInstantiator.createFromString(StdValueInstantiator.java:315) at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromString(BeanDeserializerBase.java:1283) at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:159) at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:150) at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3814) at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2858) |
我发现用
您没有提供如何使用
序列化时,我认为您可以执行以下操作:
1 2 3 4 5 | ClassContainingMap ccm = new ClassContainingMap(); ccm.getMap().put("key1","value1"); ccm.getMap().put("key2","value2"); System.out.println(om.writeValueAsString(ccm)); |
这将起作用并产生以下JSON:
1 2 3 4 5 6 | { "map": { "key1":"value1", "key2":"value2", } } |
但这不等于您要读取为
1 2 3 4 | { "key1":"value1", "key2":"value2" } |
即,前者是来自
您可以检查两个选项;
只需将其反序列化为简单的地图即可,例如:
,如果以上任何一种可能,则一种方法是使用
例如,在此处查看有关3rd的更多信息