java如何将值为JSON字符串的映射转换为对象?
我正在将一个映射转换为对象,但映射的一些值是Json字符串,我尝试使用类似下面代码的jackson进行转换,但失败了
public class Father {
private String name;
private List<Child> children;
}
public class Child {
private String name;
}
public static void main(String[] args) throws InvocationTargetException, IllegalAccessException {
String s= JSON.toJSONString(Arrays.asList(new Child("Bob"),new Child("Jackson")));
Map<String,String> map=new HashMap();
map.put("name","Jack")
map.put("children",s);
// how to convert the map to a Father Object?
//this does not work
ObjectMapper mapper = new ObjectMapper();
mapper.convertValue(map, Father.class);
}
编辑:以下是例外:
Exception in thread "main" java.lang.IllegalArgumentException: Cannot deserialize instance of `java.util.ArrayList` out of VALUE_STRING token
at [Source: UNKNOWN; line: -1, column: -1] (through reference chain: model.Father["children"])
at com.fasterxml.jackson.databind.ObjectMapper._convert(ObjectMapper.java:3750)
at com.fasterxml.jackson.databind.ObjectMapper.convertValue(ObjectMapper.java:3668)
at service.BasicBehavior.main(BasicBehavior.java:25)
Caused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.util.ArrayList` out of VALUE_STRING token
at [Source: UNKNOWN; line: -1, column: -1] (through reference chain: model.Father["children"])
at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:63)
at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1343)
at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1139)
at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1093)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.handleNonArray(CollectionDeserializer.java:332)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:265)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:245)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:27)
at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:127)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:288)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:151)
at com.fasterxml.jackson.databind.ObjectMapper._convert(ObjectMapper.java:3745)
... 2 more
# 1 楼答案
如果你使用customdeserializer来序列化你的类,它就可以了。问题是您无法转换
Child
类当然,您应该使用这个反序列化器作为
Father
类中的注释此外,你应该像那样使用
Map<String, Object>
在所有这些变化之后,它会起作用