Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
格森。反序列化为具有空id的新元素的java对象列表_Java_Json_Gson_Deserialization_Primary Key - Fatal编程技术网

格森。反序列化为具有空id的新元素的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

我有ol和li元素树。我正在动态添加此元素。在此之后,我想将它们反序列化为java对象。不幸的是,我遇到了一个错误:

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