2012-01-16 48 views
1

我有一個簡單的類下面的代碼和用於寫入的方法,然後讀取:傑克遜矢量序列化異常

ObjectMapper mapper = new ObjectMapper(); 
    try{ 
     DataStore testOut = new DataStore(); 
     DataStore.Checklist ch1 = testOut.addChecklist(); 
     ch1.SetTitle("Checklist1"); 

     String output = mapper.writeValueAsString(testOut); 
     JsonNode rootNode = mapper.readValue(output, JsonNode.class); 
     Map<String,Object> userData = mapper.readValue(output, Map.class); 
    } 


public class DataStore { 
public static class Checklist 
{ 
    public Checklist() 
    { 

    } 
    private String _title; 
    public String GetTitle() 
    { 
     return _title; 
    } 
    public void SetTitle(String title) 
    { 
     _title = title; 
    } 

} 
//Checklists 
private Vector<Checklist> _checklists = new Vector<Checklist>(); 
public Checklist addChecklist() 
{ 
    Checklist ch = new Checklist(); 
    ch.SetTitle("New Checklist"); 
    _checklists.add(ch); 
    return ch; 
} 
public Vector<Checklist> getChecklists() 
{ 
    return _checklists; 
} 
public void setChecklists(Vector<Checklist> checklists) 
{ 
    _checklists = checklists; 
} 
} 

線: 字符串輸出= mapper.writeValueAsString(TESTOUT); 導致了一個讓我困惑了幾個小時並且完全放棄使用它的異常。 任何提示表示讚賞。

這裏是個例外: 沒有找到串行類的DataStore $清單和沒有屬性發現(避免異常,禁用SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS))(通過引用鏈創造BeanSerializer:數據存儲[「清單」 - > java.util.Vector [0])

+0

我已經能夠通過在傑克遜禁用功能來刪除異常,但我仍然沒有得到任何數據寫出。 – wandercoder 2012-01-16 23:53:19

+0

錯誤信息相當清楚是不是?傑克遜使用標準的Bean內省機制找不到任何屬性。所以這就是你需要解決的問題。 – StaxMan 2012-01-18 05:28:44

回答

0

有很多種方法可以做到這一點,但我會從你做錯的事情開始:你對getter和setter方法的命名是錯誤的 - 在Java中使用「camel-case」,所以你應該使用「的getTitle」。因此,找不到屬性。

除了重命名方法使用Java風格的名稱,也可以選擇:

  • 您可以使用註釋JsonProperty("title")GetTitle(),使財產受到確認
  • 如果你不想包裝對象,您可以替換爲GetTitle()@JsonValue,在這種情況下,用於整個對象的值將是該方法的返回值。
-2

答案似乎是:你不能用Json做到這一點。我在Gson教程中也看到了一些評論,指出一些序列化不起作用。我下載了XStream,並在幾分鐘的工作時間內使用XML進行了吐槽,並且圍繞着我真正想要堅持的構想進行了更少的構建。在這個過程中,我能夠刪除很多代碼。

+1

問題是關於JSON和傑克遜 - 在這裏推薦XML就像推薦一個有破車的人購買摩托車而不是修理,因爲嘿,我更喜歡摩托車。 – shapecatcher 2013-04-22 17:03:32