与杰克逊的JSON反序列化

时间:2014-12-03 14:58:32

标签: java android json annotations jackson

我需要反序列化一个JSON对象,包含另一个JSON对象(作为String)作为值。实现这一目标的最佳方法是什么(无需在getter中实例化对象映射器以进行内部类对象的反序列化,在Android设备上需要50到100毫秒)。我正在使用Jackson Annotations,因此需要注释以实现我想要的东西。

更新。我期待一些基于注释的解决方案。像

这样的东西
@JsonDeserialize(String as MyCustomObject) 

等于

MyCustomObject myCustomObject = mapper.readValue(string, MyCustomObject.class)

1 个答案:

答案 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