我需要反序列化一个 JSON 对象,其中包含另一个 JSON 对象(作为字符串)作为值。实现此目标的最佳方法是什么(无需在 getter 中实例化对象映射器以反序列化内部类对象,这在 Android 设备上需要 50 到 100 毫秒)。我正在使用 Jackson Annotations,因此首选注释来实现我想要的。
upd. 我期待一些基于注释的解决方案。有点像
@JsonDeserialize(String as MyCustomObject)
等于
MyCustomObject myCustomObject = mapper.readValue(string, MyCustomObject.class)
最佳答案
我认为没有注释会告诉 Jackson 将输入字符串视为原始 JSON 并从中构造对象。我可能会使用自定义反序列化器注入(inject) fragment 对象映射器。
这是一个例子:
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
关于java - 使用 Jackson 进行 JSON 反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27274855/