我需要反序列化一个JSON对象,包含另一个JSON对象(作为String)作为值。实现这一目标的最佳方法是什么(无需在getter中实例化对象映射器以进行内部类对象的反序列化,在Android设备上需要50到100毫秒)。我正在使用Jackson Annotations,因此需要注释以实现我想要的东西。
更新。我期待一些基于注释的解决方案。像
这样的东西@JsonDeserialize(String as MyCustomObject)
等于
MyCustomObject myCustomObject = mapper.readValue(string, MyCustomObject.class)
答案 0 :(得分:1)
我认为没有一个注释会告诉Jackson将输入字符串视为原始JSON并从中构造一个对象。我可能会使用自定义反序列化器来注入分片对象映射器。
以下是一个例子:
public class JacksonInjectObjectMapper {
private static final String JSON =
"{\"field1\":\"{\\\"field0\\\":\\\"value0\\\"}\", " +
"\"field2\":\"value2\"}";
public static class Foo {
public String field0;
@Override
public String toString() {
return "Foo{" +
"field0='" + field0 + '\'' +
'}';
}
}
public static class Bean {
@JsonDeserialize(using = FooDeserializer.class)
public Foo field1;
public String field2;
@Override
public String toString() {
return "Bean{" +
"field1=" + field1 +
", field2='" + field2 + '\'' +
'}';
}
}
public static class FooDeserializer extends JsonDeserializer<Foo> {
@Override
public Foo deserialize(
final JsonParser jp, final DeserializationContext ctxt)
throws IOException {
final ObjectMapper mapper = (ObjectMapper) ctxt.findInjectableValue(
ObjectMapper.class.getName(),
null,
null);
final String json = jp.getValueAsString();
System.out.println(json);
return mapper.readValue(json, Foo.class);
}
}
public static void main(String[] args) throws IOException {
final ObjectMapper mapper = new ObjectMapper();
final InjectableValues.Std injectableValues = new InjectableValues.Std();
injectableValues.addValue(ObjectMapper.class, mapper);
mapper.setInjectableValues(injectableValues);
final Bean bean = mapper.readValue(JSON, Bean.class);
System.out.println(bean);
}
}
输出:
{"field0":"value0"}
Bean{field1=Foo{field0='value0'}, field2='value