gpt4 book ai didi

android - 处理来自 JsonReader 的空指针

转载 作者:太空狗 更新时间:2023-10-29 16:34:42 25 4
gpt4 key购买 nike

我正在使用 JsonReader 从网站获取大量数据并保存到数据库。顺便说一句,每当读取器找不到对象项的值时,它就会失败并停止执行。

这是我的错误;

System.err﹕ java.lang.IllegalStateException: Expected a string but was NULL at line 1 column 359337 path $[19].date

即使指定的值不可用,在遇到错误之前加载的所有对象似乎也丢失了并且没有保存到数据库中。有没有办法处理这些错误并保留到目前为止已加载的对象?我已将 JsonReader 设置为宽松。

这是方法中解析数据的部分:

private Post read(JsonReader reader) throws Exception {
reader.beginObject();

while (reader.hasNext()) {
String name = reader.nextName();

switch (name) {
case TITLE:
mTitle = new StringBuilder();
mTitle.append(reader.nextString());
break;
case AUTHOR:
if (reader.hasNext()) {
JsonToken peek = reader.peek();

if (peek == JsonToken.NULL) {
reader.skipValue();
} else {
reader.beginObject();

while (reader.hasNext()) {
String enclosedName = reader.nextName();

switch (enclosedName) {
case NAME:
mAuthor = new StringBuilder();
mAuthor.append(reader.nextString());
break;
case AVATAR:
mAvatar = new StringBuilder();
mAvatar.append(reader.nextString());
break;
default:
reader.skipValue();
break;
}
}

reader.endObject();
}
}
break;
case CONTENT:
mDescription = new StringBuilder();
mDescription.append(reader.nextString());
break;
case URL:
mEntryLink = new StringBuilder();
mEntryLink.append(reader.nextString());
break;
case DATE:
mDateStringBuilder = new StringBuilder();
mDateStringBuilder.append(reader.nextString());
break;
case GUID:
mGuid = new StringBuilder();
mGuid.append(reader.nextString());
break;
case FEATURED_IMAGE:
if (reader.hasNext()) {
JsonToken look = reader.peek();

if (look == JsonToken.NULL) {
reader.skipValue();
} else {
mFeaturedImage = new StringBuilder();
reader.beginObject();

while (reader.hasNext()) {
String itemToLookFor = reader.nextName();

switch (itemToLookFor) {
case SOURCE:
mFeaturedImage.append(reader.nextString());
break;
default:
reader.skipValue();
break;
}
}

reader.endObject();
}
}
break;
case TERMS:
if (reader.hasNext()) {
JsonToken check = reader.peek();

if (check == JsonToken.NULL) {
reader.skipValue();
} else {
reader.beginObject();

while (reader.hasNext()) {
String stuff = reader.nextName();

switch (stuff) {
case CATEGORIES:
reader.beginArray();

itemCategory = new StringBuilder();

while (reader.hasNext()) {
reader.beginObject();

while (reader.hasNext()) {
String item = reader.nextName();

switch (item) {
case NAME:
itemCategory.append(reader.nextString()).append(",");
break;
default:
reader.skipValue();
break;
}
}

reader.endObject();
}
reader.endArray();
break;
case TAGS:
reader.beginArray();

itemTags = new StringBuilder();

while (reader.hasNext()) {
reader.beginObject();

while (reader.hasNext()) {
String item = reader.nextName();

switch (item) {
case NAME:
itemTags.append(reader.nextString()).append(",");
break;
default:
reader.skipValue();
break;
}
}

reader.endObject();
}
reader.endArray();
break;
default:
reader.skipValue();
break;
}
}

reader.endObject();
}
}
break;
default:
reader.skipValue();
break;
}
}

reader.endObject();

return new Post(mAuthor.toString(), mAvatar.toString(), mDateStringBuilder.toString(), mTitle.toString(), mEntryLink.toString(), mDescription.toString(), mGuid.toString(), mFeaturedImage.toString(), itemTags.toString(), itemCategory.toString());
}

最佳答案

我认为您可能没有检查 NULL 元素,情况似乎是这样。

在某一时刻你使用:

JsonToken check = reader.peek();

if (check == JsonToken.NULL) {

没错。但是,在其他地方,您只需获取 String:

mDescription.append(reader.nextString());

在所有获得String 的地方,您需要检查是否确实存在意外类型(例如NULL)。在这种情况下,您需要应用适当的错误遏制代码。

顺便说一句,您真的不需要创建所有这些 StringBuilder。因为每次初始化后您只将一个 String 放入其中。只需使用 String 即可节省大量时间。如果您打算将每种类型的所有内容写入一个 StringBuilder,那么您需要在开始循环之前对它们进行初始化。

关于android - 处理来自 JsonReader 的空指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31566165/

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