java - 使用 Jackson 进行 JSON 反序列化

标签 java android json annotations jackson

我需要反序列化一个 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/

相关文章:

java - Play 2 : Difference between appDependencies and libraryDependencies?

java - 分页库的意外行为

sql - 从 sql 表中的 json 中提取所有值

python - 尝试在 python 中将 CSV 转换为 JSON 以发布到 REST API

Java 8 Stream - 排序方法的执行标准与过滤器和映射方法不同

java - Java中比较字符串的三种不同方式

java - AndroidManifest 不匹配

java - 从 c++ (jni) 调用 java 函数根本不起作用

javascript - 内联 JavaScript 与 CSP 级别 1 结合使用

java - 多次检查值是否在数组中的最快方法