簡體   English   中英

傑克遜:自定義集合序列化到JSON

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM