格森。反序列化为具有空id的新元素的java对象列表
我有ol和li元素树。我正在动态添加此元素。在此之后,我想将它们反序列化为java对象。不幸的是,我遇到了一个错误:格森。反序列化为具有空id的新元素的java对象列表,java,json,gson,deserialization,primary-key,Java,Json,Gson,Deserialization,Primary Key,我有ol和li元素树。我正在动态添加此元素。在此之后,我想将它们反序列化为java对象。不幸的是,我遇到了一个错误: SEVERE:Servlet[dispatcher]在路径为[/derp]的上下文中的Servlet.service()引发了异常[请求处理失败;嵌套异常为java.lang.NullPointerException],根本原因为java.lang.NullPointerException] 在com.derp.generic.model.GenericModel.getId(G
SEVERE:Servlet[dispatcher]在路径为[/derp]的上下文中的Servlet.service()引发了异常[请求处理失败;嵌套异常为java.lang.NullPointerException],根本原因为java.lang.NullPointerException]
在com.derp.generic.model.GenericModel.getId(GenericModel.java:28)
我知道这是因为我的新元素没有id。但这意味着,因为id是在数据库服务器上生成的。通常id我会这样想(通过setter创建对象分配参数,但没有id)不会有错误。在持久化之后,这个新对象将获得一个id
这也是我在这里努力实现的目标。在正确的反序列化之后,我想将这个对象持久化,这将为他创建一个Id
但我必须告诉我的Gson构建器允许null,或者不要尝试设置未声明的参数(为null)
这是我的密码:
public List<SkeletonElement> toObject(String jsonObject) {
Gson gson = new GsonBuilder()
.serializeNulls()
.registerTypeAdapter(Long.class, new LongTypeAdapter())
.create();
List<SkeletonElement> list = gson.fromJson(jsonObject, new TypeToken<List<SkeletonElement>>(){}.getType());
return list;
}
此方法返回一个原语
long
。您不能从此方法返回null
public long getId() { return id; }
将返回类型修改为Long
。此方法返回的实例变量可以是null
,但方法本身不能
public Long getId() { return id; }
对setter执行相同的操作
public void setId(Long id) { this.id = id; }
您还可以在返回之前检查null
public long getId() { id == null ? 0L : id.longValue(); }
如果可能的话,将getId更改为返回一个Long对象,而不是原语Long。自动转换为原语long会导致空指针异常。错误发生在
GenericModel
类的第28行,但您提供的类只有约19行。你把它截断了吗?检查stacktrace底部的第一个错误。无论如何,根据错误,您的GenericModel
子类的id
看起来是null
。尝试将id
getter/setter的类型更改为Long
,以匹配它们正在变异/访问的实例变量。是。我截断了不需要的行。28的行是public long getId(){return id;}
它是null,因为null首先在json中!现在它开始工作了。谢谢从原始的long对象变成long对象已经足够了
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public long getId() { id == null ? 0L : id.longValue(); }