2011-11-21 23 views
4

使用Jersey和Jackson創建REST接口時,如何在其中有0個或1個元素時將List字段序列化爲列表。例如:如何讓澤西/傑克遜序列化空列表;單個元素列表作爲數組

@XmlRootElement(name="foo") 
public class Foo { 
    @XmlElement 
    public List<Bar> getBars() { 
    return this.bars; 
    } 
} 

@Path("foo") 
public FooResource { 
    @GET 
    public Foo getFoo() { 
    return theFoo; 
    } 
} 

當杆沒有任何元素,其結果作爲串行化和null當它含有一個單獨的元件,其序列爲元素,不包含單個元件的陣列。有沒有辦法讓這些總是序列化爲一個數組?

僅供參考,我使用的是Jersey 1.10和Jackson 1.9.2。

回答

4

我很確定您實際上並未使用Jackson(JSON序列化的「POJO」變體),sinc傑克遜不會將單元素陣列或列表轉換爲其他任何東西。所以你可能使用了傳統的輸出方法之一(如拋棄);這意味着如果你配置系統使用POJO映射,它應該只是工作。

+0

你是對的,傑克遜沒有正確配置。除了將'org.codehaus.jackson.jaxrs'添加到com.sun.jersey.config.property.packages初始參數中,是否有更明確的方式來配置Jackson在Jersey中的使用? –

+0

使用標準的JAX-RS註冊機制可以顯式註冊來自jax-rs jar('JacksonJsonProvider')的提供者類,請參閱http://wiki.fasterxml.com/JacksonFAQ#JAX-RS(例如)以獲取詳細信息。 – StaxMan

3

我寫了一篇博客文章久遠有關強制澤西正確序列的單元素數組,不知道它現在過時(其從2010年年中!),but it might be of use.

注意從布里爾Pappin的博客評論在博客上展示了一種不同的方法,這意味着升級您正在使用的Jettison庫。

總之你可以編寫自定義JaxbContextResolver,看起來有點像:

@Provider 
@Component 
public class JAXBContextResolver implements ContextResolver { 

    private JAXBContext context; 

    public JAXBContextResolver() throws Exception { 
     MappedBuilder builder = JSONConfiguration.mapped(); 
     builder.arrays("invite"); 
     builder.rootUnwrapping(true); 
     this.context = new JSONJAXBContext(builder.build(), Payload.class); 
    } 

    public JAXBContext getContext(Class objectType) { 
     return (Payload.class.equals(objectType)) ? context : null; 
    } 
} 

爲了清楚起見,我的有效載荷類看起來有點像

@XmlRootElement(name = "response") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Payload { 

    @XmlElement(name = "invite") 
    List invites; 

    ... etc. 

關於停止傑克遜序列化bean屬性爲空,請參見my previous answer here, about using annotations to change that behaviour.

+0

好的。我創建了一個ContextResolver,它使用反射來更改我的數據bean中所有列表的序列化行爲。這對我的口味來說仍然感覺有點過於強悍。如果有更好的方法,仍然對它感興趣。 –

+0

看看Brill Pappin評論我的博客鏈接的答案,他描述了一個解決方案,您可以升級傑克遜依賴的Jettison版本.. –

+0

嗯,您可能是指「傑西依賴於Jettison」(對於其中一個JSON綁定方法)。傑克遜不依賴Jettison(反之亦然) – StaxMan

1

我設法解決了最近澤西島json庫(v1.14 Sep 2012)中的JSON數組「bug」。祕密成分是JSONConfiguration和ContextResolver的魔力。看到我的後續文章,它有一個完整的代碼示例,定製的ContextResolver和其餘的應用程序類可能有點模糊邏輯在第一眼看。

How to serialize Java primitives using Jersey REST

原語和零或單元素列表陣列是正確序列化爲JSON文檔。

0

是的,我們也面臨同樣的問題。傑克遜不能用0或單個元素將列表序列化爲json數組。所以我們試圖使用Json的ObjectMapper將POJO對象轉換爲String。它將序列化java List到json數組,而不管List中元素的數量(0或1或> 0)。代碼如下所示:

request = new ObjectMapper().writeValueAsString(pojo); 

其中請求的類型爲Object。這不會影響響應。你可以試試看。