2012-06-23 22 views
1

我想在springmvc中接受一個對象的部分json字符串的方法,並讓傑克遜自動爲我解序列化它。 我可以通過僅使用我想要的屬性創建一個臨時對象來解決這個問題,或者將它作爲一個字符串傳遞並使用Gson爲我設置desearialize,但這些感覺很不好。有什麼辦法可以告訴傑克遜如何做到這一點?部分反序列化一個json對象在平靜的郵政調用

這裏是控制器片段:

@RequestMapping(value = "/task", 
    method = RequestMethod.POST, 
    consumes="application/json") 
public @ResponseBody String postTask(@RequestBody Task task){ 
    if(task.getId() == null){ 
     task.setId(UUID.randomUUID()); 
    } 
    if(task.getDate_entered() == 0){ 
     task.setDate_entered(System.currentTimeMillis()); 
    } 
    TaskDao.addTask(task); 
    return "success"; 
} 

,任務,基本POJO:

@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL) 
public class Task { 
    private UUID id; 
    private String name; 
    private String description; 
    private long date_entered; 
    private long finish_by; 

    public UUID getId() { 
     return id; 
    } 
    public void setId(UUID id) { 
     this.id = id; 
    } 
    // Rest of the getters and setters 
} 

如果無法通過我的其他春天相關的問題告訴,我有點飛行盲目,並不能找出適合這一個的谷歌查詢。

謝謝!

+1

根據傑克遜文檔,這種行爲應該是標準的。即如果沒有值的屬性它的setter不被調用,但對象仍然被創建。見http://jackson-users.ning.com/forum/topics/what-happens-if-a-property-is-missing – Andrew

+0

哦,不!如果是這種情況,那麼我要麼使用舊版本,要麼讓它設置錯誤。我會盡力確認兩者。謝謝 – Chris

+2

@Awalsh:今天早上aannnddd它按預期工作......不完全確定我之前更改了啓用/禁用它的功能。 我會嘗試找出更改的內容並將其作爲答案。 – Chris

回答

0

您需要在方法(用於反序列化的setter和用於序列化的getter)上的字段上使用jackson的@JsonIgnore註釋,或者您想忽略序列化和/或反序列化的字段。例如 在您的例子,如果你不想要序列description,那麼你可以做,

@JsonIgnore 
public void setDescription(String description) { 
     this.description = description; 
} 

你會看到,你不會在轉換後的模型得到的description值。

+0

這將允許選擇什麼將被動態反序列化? 例如,您可以一次傳入UUID,然後是下一個名稱? – Chris

+0

有了這個配置,NO。因爲我們在類定義本身進行了註釋,我認爲不可能在運行中更改類定義。 –