gpt4 book ai didi

java - Gson 。反序列化为具有 null id 的新元素的 java 对象列表

转载 作者:行者123 更新时间:2023-11-30 03:37:05 25 4
gpt4 key购买 nike

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

SEVERE: Servlet.service() for servlet [dispatcher] in context with path [/derp] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause java.lang.NullPointerException
at 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;
}

自定义适配器应该能够解决问题:

package com.derp.generic.helpers;

import java.io.IOException;

import com.google.gson.TypeAdapter;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import com.google.gson.stream.JsonWriter;

public class LongTypeAdapter extends TypeAdapter<Long>{
@Override
public Long read(JsonReader reader) throws IOException {
if(reader.peek() == JsonToken.NULL){
reader.nextNull();
return null;
}
String stringValue = reader.nextString();
try{
Long value = Long.valueOf(stringValue);
return value;
}catch(NumberFormatException e){
return null;
}
}
@Override
public void write(JsonWriter writer, Long value) throws IOException {
if (value == null) {
writer.nullValue();
return;
}
writer.value(value);
}
}

声明 id 的通用模型:

@MappedSuperclass
public abstract class GenericModel<T extends GenericModel<?>> {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;


public long getId() {return id;}
public void setId(long id) {this.id = id;}

public GenericModel() {
}

public GenericModel(Long id) {
super();
this.id = id;
}
}

以及末尾带有 null id 对象的 json 对象

[
{
"name": "Title1",
"id": "1",
"type": "SkeletonJobElement",
"parent_id": "null",
"children": [
{
"name": "Title11",
"id": "2",
"type": "SkeletonJobElement",
"parent_id": "1",
"children": [
{
"name": "Title111",
"id": "5",
"type": "SkeletonFileElement",
"parent_id": "2",
"children": []
},
{
"name": "Title112",
"id": "6",
"type": "SkeletonFileElement",
"parent_id": "2",
"children": []
}
]
}
]
},
{
"name": "Title2",
"id": "3",
"type": "SkeletonJobElement",
"parent_id": "null",
"children": [
{
"name": "Title21",
"id": "4",
"type": "SkeletonJobElement",
"parent_id": "3",
"children": []
}
]
},
{
"name": "Title3",
"id": "null",
"type": "SkeletonJobElement",
"parent_id": "null",
"children": []
}
]

最佳答案

此方法返回一个原始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(); }

关于java - Gson 。反序列化为具有 null id 的新元素的 java 对象列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27608249/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com