2010-08-23 35 views
13

我想在Tomcat(當前使用Jackson)中將Java對象轉換爲JSON。根據RESTful請求中的字段,我只想序列化這些字段。我想支持任何字段子集的請求,所以我想在運行時(動態地)執行它。運行時部分JSON序列化(用於REST風格的查詢)

例如,假設我要支持部分序列化用戶對象:

class User { 
    private final String id; 
    private final String firstName; 
    private final String lastName; 

    public User(String id, String firstName, String lastName) { 
     this.id = id; 
     this.firstName = firstName; 
     this.lastName = lastName; 
    } 

    public String getId() { return id; } 
    public String getFirstName() { return firstName; } 
    public String getLastName() { return lastName; } 
} 

如果我做了一個請求:

GET /users/{id}/?fields=firstName,lastName 

我想要得到的東西像{"firstName":"Jack","lastName":"Johnson"}

如果我做了一個請求:

GET /users/{id}/?fields=firstName 

我想要得到的東西像{"firstName":"Jack"}

Jackson的JSON View能夠定義邏輯屬性的子集(通過獲取者或字段訪問的東西)來序列化。但是,它們是靜態定義的(使用註釋),只能動態選擇(每個序列化)。實際上,我想支持請求對象字段的任何子集,所以我可能有成千上萬的JSON視圖(10個字段意味着1,023個子集!)。

什麼JSON庫在運行時支持部分序列化?

+0

[這問題](http://stackoverflow.com/questions/2981359/jackson-suppressing-serializationwrite-of-properties-dynamically)是相關的。 – 2010-08-23 17:34:15

回答

0

我認爲json-lib和flex-json支持更多的動態/靈活過濾。

與傑克遜的一些用戶做的是使用HashMaps或JsonNodes作爲更鬆散的結構,並從那裏進行過濾。此外,雖然這對短期無效,但Jackson 1.6對JsonNode(retainAll(String ... names),remove(String ... names)以及可能的ObjectMapper都有改進,因爲這是一個

+0

順便說一句,這是有趣的 - 在工作中我需要完全相同的支持(請求枚舉字段,它希望) - 這就是爲什麼我也尋找更多的動態支持自己。 – StaxMan 2010-08-24 17:32:03

1

我們使用Google GSON在Java對象和JSON之間來回轉換,我不確定它是否具有您正在查找的功能,但它非常易於使用且文檔也很好。

如果你找不到一個能夠滿足你需要的庫,那麼我建議使用鬆散的結構化類(如HashMap)或自定義表示類作爲代碼和JS之間的鏈接上。這會增加一兩個層,但保持複雜性。祝你好運。

0

從Spring 4.2.0.Release,你必須返回,也可以使用在以下鏈接討論JsonFilters它做你的領域完全控制: 1. https://jira.spring.io/browse/SPR-12586 2. http://wiki.fasterxml.com/JacksonFeatureJsonFilter

@RequestMapping(method = RequestMethod.POST, value = "/springjsonfilter") 
    public @ResponseBody MappingJacksonValue byJsonFilter(...) { 
     MappingJacksonValue jacksonValue = new MappingJacksonValue(responseObj);  
     jacksonValue.setFilters(customFilterObj); 
     return jacksonValue; 
    } 
相關問題