[英]Jackson : custom collection serialization to JSON
我正在嘗試json序列化一個MyRootClass類,其屬性是第二個類MyClass的元素集合:
public class MyRootClass {
private List<MyInterface> list = new ArrayList<MyInterface>();
// getter / setter
}
public class MyClass implements MyInterface {
private String value = "test";
// getter / setter
}
以下代碼:
MyRootClass root = new MyRootClass();
root.getList().add(new MyClass());
ObjectMapper mapper = new ObjectMapper();
mapper.writeValue(System.out, root);
生成此JSON輸出:
{"list": [ {"value":"test"} ] }
而不是我需要的,集合中的每個對象都用一個名稱序列化:
{"list": [ {"myclass": {"value":"test"}} ] }
有沒有辦法用Jackson實現它? 我考慮過編寫自定義序列化程序,但是我沒有找到任何與對象集合相關的內容。
這取決於你想用名字實現什么; 但是,如果你想在這里包含'myclass'是類型信息(或者可以表現得好像它被使用;如果你不使用Jackson反序列化它並不重要),這可以做到。
如果是這樣,您將注釋MyInterface:
@JsonTypeInfo(use=Id.NAME, include=As.WRAPPER_OBJECT)
和MyClass:
@JsonTypeName("myclass")
(如果沒有定義,默認名稱將是該類的非限定名稱)
上面的@JsonTypeInfo
定義了要使用的類型名稱(而不是Java類名或自定義方法),並且使用包裝器對象完成包含(替代方法是包裝器數組和as-property)
那么你應該看到預期的輸出。
你想要的是在輸出中包含類的名稱。 這不是json序列化程序的行為方式 - 它們只包含字段名稱。
你能做的是介紹另一堂課。
class MyClass implements MyInterface {
private MyOtherClass myclass;
}
class MyOtherClass {
private String value = "test";
}
您可以使用這樣的輔助對象:
public static class MyObject {
public int i;
public MyObject(int i) { this.i = i; }
public MyObject() {}
}
@JsonDeserialize(contentAs=MyObject.class)
public static class MyHelperClass extends ArrayList<MyObject> {
}
@Test
public void testCollection() throws JsonGenerationException, JsonMappingException, IOException {
final Collection<MyObject> l = new ArrayList<MyObject>();
l.add(new MyObject(1));
l.add(new MyObject(2));
l.add(new MyObject(3));
final ObjectMapper mapper = new ObjectMapper();
final String s = mapper.writeValueAsString(l);
final Collection<MyObject> back = mapper.readValue(s, MyHelperClass.class);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.