杰克逊矢量序列化异常
我有一个简单的类下面的代码和用于写入的方法,然后读取:杰克逊矢量序列化异常
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])
有很多种方法可以做到这一点,但我会从你做错的事情开始:你对getter和setter方法的命名是错误的 - 在Java中使用“camel-case”,所以你应该使用“的getTitle”。因此,找不到属性。
除了重命名方法使用Java风格的名称,也可以选择:
- 您可以使用注释
JsonProperty("title")
为GetTitle()
,使财产受到确认 - 如果你不想包装对象,您可以替换为
GetTitle()
的@JsonValue
,在这种情况下,用于整个对象的值将是该方法的返回值。
答案似乎是:你不能用Json做到这一点。我在Gson教程中也看到了一些评论,指出一些序列化不起作用。我下载了XStream,并在几分钟的工作时间内使用XML进行了吐槽,并且围绕着我真正想要坚持的构想进行了更少的构建。在这个过程中,我能够删除很多代码。
问题是关于JSON和杰克逊 - 在这里推荐XML就像推荐一个有破车的人购买摩托车而不是修理,因为嘿,我更喜欢摩托车。 – shapecatcher 2013-04-22 17:03:32
我已经能够通过在杰克逊禁用功能来删除异常,但我仍然没有得到任何数据写出。 – wandercoder 2012-01-16 23:53:19
错误信息相当清楚是不是?杰克逊使用标准的Bean内省机制找不到任何属性。所以这就是你需要解决的问题。 – StaxMan 2012-01-18 05:28:44