2014-12-03 128 views
2

我需要反序列化一个JSON对象,包含另一个JSON对象(作为字符串)作为值。什么是最好的方式来实现这一点(没有实例化一个对象映射器内部getter的反序列化的Android设备上需要50至100毫秒的内部类对象)。我使用杰克逊注解,所以注释以实现我想要的是首选。JSON反序列化与杰克逊

upd。我期待一些基于注解的解决方案。喜欢的东西

@JsonDeserialize(String as MyCustomObject) 

这将是等于

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

也许使用自定义串并转换器。见http://stackoverflow.com/questions/5269637/custom-deserialization-of-json-field-with-jackson-in-java – 2014-12-03 15:04:52

+0

@andresoviedo,我已经更新了我的问题。 – localhost 2014-12-03 15:11:14

+1

您预计何时会处理这些注释? – sviklim 2014-12-04 09:08:35

回答

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 
+0

我的“Bean”类包含许多其他JSON对象,因此单个字符串构造函数不是解决方案。 – localhost 2014-12-04 09:07:24

+0

@localhost我明白了。我用一个自定义反序列化器的例子更新了我的答案,它重新使用了对象映射器实例。 – 2014-12-04 11:11:14

+0

这正是我需要的! – localhost 2014-12-04 13:22:35