我正在使用JsonReader从网站获取大量数据并保存到数据库。顺便提一下,每当读者没有找到对象项的值时,它就会失败并停止执行。
这是我的错误;
System.err﹕ java.lang.IllegalStateException: Expected a string but was NULL at line 1 column 359337 path $[19].date
即使指定的值不可用,似乎在遇到错误之前加载的所有对象也会丢失,并且不会保存到db。有没有办法处理这些错误并保留到目前为止已加载的对象?我已将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());
}
答案 0 :(得分:5)
我想可能你没有检查NULL
元素,似乎是这种情况。
您曾经使用过:
JsonToken check = reader.peek();
if (check == JsonToken.NULL) {
这是正确的。但是,在其他地方,您只需获得String
:
mDescription.append(reader.nextString());
在您获得String
的所有地方,您需要检查是否确实存在意外类型(例如NULL
)。在这种情况下,您需要应用适当的错误包含代码。
顺便说一下,你真的不需要创建所有这些StringBuilder
。由于在每次初始化后只将String
放入其中。只需使用String就可以节省大量时间。如果您打算为每种类型将所有内容写入StringBuilder
,则需要在开始循环之前初始化它们。