从JsonReader处理空指针

Ale*_*mbo 3 android json nullpointerexception jsonreader

我正在使用JsonReader从网站获取大量数据并保存到数据库.顺便提一下,每当读者没有找到对象项的值时,它就会失败并停止执行.

这是我的错误;

System.err? java.lang.IllegalStateException: Expected a string but was NULL at line 1 column 359337 path $[19].date
Run Code Online (Sandbox Code Playgroud)

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

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

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());
        }
Run Code Online (Sandbox Code Playgroud)

Kno*_*sos 6

我想可能是你没有检查NULL元素,似乎是这种情况.

您曾经使用过:

JsonToken check = reader.peek();

if (check == JsonToken.NULL) {
Run Code Online (Sandbox Code Playgroud)

那是正确的.但是,在其他地方你只需得到String:

mDescription.append(reader.nextString());
Run Code Online (Sandbox Code Playgroud)

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

顺便说一句,你真的不需要创建所有这些StringBuilder.因为你只是String在每次初始化后只放入一个.只需使用String就可以节省大量时间.如果您打算StringBuilder为每种类型写入所有内容,则需要在开始循环之前初始化它们.