我有以下代码,其中包含一个简单的类和一个用于编写然后阅读的方法:
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] )
答案 0 :(得分:0)
有多种方法可以做到这一点,但我会从你做错了开始:你的getter和setter方法的命名是错误的 - 在Java中使用“camel-case”,所以你应该使用“getTitle” ”。因此,找不到属性。
除了重命名方法以使用Java风格的名称外,还有其他选择:
JsonProperty("title")
使用注释GetTitle()
,以便识别该属性@JsonValue
添加GetTitle()
,在这种情况下,用于整个对象的值将是该方法的返回值。答案 1 :(得分:-2)
答案似乎是:你不能用Json做到这一点。我也在Gson教程中看过评论,说明某些序列化不起作用。我下载了XStream并在几分钟的工作中使用XML进行了解决,并且围绕我真正想要坚持的内容进行了很多更少的构建。在这个过程中,我能够删除大量代码。