2012-01-16 113 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