杰克逊矢量序列化异常

时间:2012-01-16 23:29:05

标签: serialization jackson

我有以下代码,其中包含一个简单的类和一个用于编写然后阅读的方法:

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;
}
}

该行:           String output = mapper.writeValueAsString(testOut); 导致一个异常让我困惑了好几个小时并且即将放弃使用它。 任何提示都表示赞赏。

以下是例外情况: 没有找到类DataStore $ Checklist的序列化器,也没有发现创建BeanSerializer的属性(为了避免异常,禁用SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS))(通过引用链:DataStore [“checklists”] - &gt; java.util.Vector [0] )

2 个答案:

答案 0 :(得分:0)

有多种方法可以做到这一点,但我会从你做错了开始:你的getter和setter方法的命名是错误的 - 在Java中使用“camel-case”,所以你应该使用“getTitle” ”。因此,找不到属性。

除了重命名方法以使用Java风格的名称外,还有其他选择:

  • 您可以为JsonProperty("title")使用注释GetTitle(),以便识别该属性
  • 如果您不想要包装器对象,您也可以为@JsonValue添加GetTitle(),在这种情况下,用于整个对象的值将是该方法的返回值。

答案 1 :(得分:-2)

答案似乎是:你不能用Json做到这一点。我也在Gson教程中看过评论,说明某些序列化不起作用。我下载了XStream并在几分钟的工作中使用XML进行了解决,并且围绕我真正想要坚持的内容进行了很多更少的构建。在这个过程中,我能够删除大量代码。