JSON反序列化与杰克逊
问题描述:
我需要反序列化一个JSON对象,包含另一个JSON对象(作为字符串)作为值。什么是最好的方式来实现这一点(没有实例化一个对象映射器内部getter的反序列化的Android设备上需要50至100毫秒的内部类对象)。我使用杰克逊注解,所以注释以实现我想要的是首选。JSON反序列化与杰克逊
upd。我期待一些基于注解的解决方案。喜欢的东西
@JsonDeserialize(String as MyCustomObject)
这将是等于
MyCustomObject myCustomObject = mapper.readValue(string, MyCustomObject.class)
答
我不认为有一个注释,这将告诉杰克逊对待输入字符串作为原料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
也许使用自定义串并转换器。见http://*.com/questions/5269637/custom-deserialization-of-json-field-with-jackson-in-java – 2014-12-03 15:04:52
@andresoviedo,我已经更新了我的问题。 – localhost 2014-12-03 15:11:14
您预计何时会处理这些注释? – sviklim 2014-12-04 09:08:35