【问题标题】:JSON deserialisation with Jackson使用 Jackson 进行 JSON 反序列化
【发布时间】:2014-12-03 14:58:31
【问题描述】:

我需要反序列化一个 JSON 对象,其中包含另一个 JSON 对象(作为字符串)作为值。实现这一目标的最佳方法是什么(没有在 getter 中实例化对象映射器以反序列化内部类对象,这在 Android 设备上需要 50 到 100 毫秒)。我正在使用 Jackson Annotations,所以最好通过注释来实现我想要的。

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

@JsonDeserialize(String as MyCustomObject) 

等于

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

【问题讨论】:

标签: java android json annotations jackson


【解决方案1】:

我认为没有注释会告诉杰克逊将输入字符串视为原始 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

【讨论】:

  • 我的“Bean”类包含许多其他 JSON 对象,因此单个字符串构造函数不是解决方案。
  • @localhost 我明白了。我已经用一个自定义反序列化器的例子更新了我的答案,它重用了对象映射器实例。
  • 这正是我所需要的!
猜你喜欢
  • 1970-01-01
  • 2021-12-13
  • 2014-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-12
  • 1970-01-01
相关资源
最近更新 更多