问题描述
我有一个json字符串,看起来像:
{"a":5,"b":"asd","c":"{\"d\":3}"}
可以反序列化为这样的对象:
class A {
int a; // --> 5
String b; // --> 'asd'
String c; // --> '{"d":3}'
}
但我希望将其反序列化为:
class A {
int a; // --> 5
String b; // --> 'asd'
MyClass c; // --> '{"d":3}'
}
MyClass在哪里:
class MyClass {
int d; // --> 3
}
在反序列化期间如何在杰克逊中实现?
解决方法
尝试两次反序列化:
A aObject = mapper.readValue(json,A.class);
aObject.setCObject(mapper.readValue(aObject.getC(),C.class));
class A {
int a;
String b;
String c;
C cObject;
}
class C {
int d;
}
,
我刚刚发现可以使用杰克逊转换器:
public class MyClassConverter implements Converter<String,MyClass> {
@Override
public MyClass convert(String value) {
try {
return new ObjectMapper().readValue(value,MyClass.class);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
}
@Override
public JavaType getInputType(TypeFactory typeFactory) {
return typeFactory.constructSimpleType(String.class,null);
}
@Override
public JavaType getOutputType(TypeFactory typeFactory) {
return typeFactory.constructSimpleType(MyClass.class,null);
}
}
在Bean中:
class A {
int a;
String b;
@JsonDeserialize(converter = MyClassConverter.class)
MyClass c;
}