2017-09-26 27 views
0

我有一个简单的问题,现在正在让我想方设法弄清楚。反序列化特定属性的列表

我想反序列化这样的:

[ 
    { "a": "a", "b": 1 } 
    { "a": "b", "b": 2 } 
] 

进入这个:

@Data 
public class MyObject { 
    private List<BaseType> rootList; 
} 

我想这样做的原因是因为我以前只延长ArrayList的,但现在我真的需要一个真正的类它需要继承,所以我不能再这样做了。我基本上只需要杰克逊来填充那个内在属性,而不是我必须包装这个类。

有没有这样的注释?

谢谢!

+0

附加BASETYPE类代码 –

回答

1

如果我得到你的问题的权利,你想反序列化json数组到对象与数组字段,包含所有的json数组项。你可以做的一件事是创建自定义构造函数并用@JsonCreator对其进行注释。对于序列化,您可以在rootList列表字段上方使用@JsonValue

private static String json = "[{\"a\":\"a\",\"b\":1},{\"a\":\"b\",\"b\":2}]"; 
@Data 
public static class MyObject { 
    @JsonValue // used during serialization 
    private List<BaseType> rootList; 
    @JsonCreator //used during deserialization 
    public MyObject(List<BaseType> items) { 
     this.rootList = items; 
    } 
} 

@Data 
public static class BaseType { 
    @JsonProperty 
    private String a; 
    @JsonProperty 
    private int b; 
} 

public static void main(String[] args) throws Exception { 
    ObjectMapper mapper = new ObjectMapper(); 
    MyObject value = mapper.readValue(json, MyObject.class); 
    System.out.println(value); 
    System.out.println(mapper.writeValueAsString(value)); 
} 
+0

难道就没有别的办法做到这一点以外创建@JsonCreator一个新的构造?尽管这是一个相当不错的解决方案,它基本上就是我想要的,您是否测试过它以确保它能正确地反序列化?我即将对其进行测试。 –

+0

由于这个答案有点延迟,我最终制作了一个自定义的反序列化器,将这样的根列表反序列化到具有自定义注释的字段上。然后我使用@JsonDeserializer(使用= MyCustomDeserializer.class)对@JacksonInside进行了自定义注释......尽管我喜欢使用本地jackson注释的解决方案,因此我不必担心Deserializer中的边缘情况。 –

+0

@ A.Bello离开了一段时间,很抱歉拖延。是的,它应该像你期望的那样工作。 '@ JsonDeserializer'也是很好的选择,特别是如果你不能以任何方式改变POJO代码,就像POJO是三维派对库的一部分一样,你仍然可以在mixin中使用'@ JsonDeserializer',但不能使用这种方法。是的,你需要在自定义构造函数上面有@JsonCreator或者2 -nd选项是使用静态工厂函数。 [这是更多信息](http://www.cowtowncoder.com/blog/archives/2011/07/entry_457.html) – varren

相关问题