1

JsonReaderを使用してjsonを解析しようとしています。解析中に、アプリがクラッシュする2つのシナリオに遭遇しました。1)。JsonArrayに別のJsonArrayのセットが含まれていて、そのうちの1つがnullである場合。結果が配列で、さらに21個の配列があり、最後の配列がnullであるシナリオを示しています。

"results": [(21)
[...(5)],-
[...(5)],-
[...(5)],-
[...(5)],-
[...(5)],-
[...(5)],-
[...(5)],-
[...(5)],-
[...(5)],-
[...(5)],-
[...(5)],-
[...(5)],-
[...(5)],-
[...(5)],-
[...(5)],-
[...(5)],-
[...(5)],-
[...(5)],-
[...(5)],-
[...(5)],-
[(0)]
],

2)。JsonArrayにオブジェクトのセットがあり、オブジェクトの1つがnullの場合。同じ例を添付しました。ここに、21個のオブジェクトを含み、そのうち1個がnullであるJsonArrayとしてソースがあります。

"source": [(21)
{...},-
{...},-
{...},-
{...},-
{...},-
{...},-
{...},-
{...},-
{...},-
{...},-
{...},-
{...},-
{...},-
{...},-
{...},-
{...},-
{...},-
{...},-
{...},-
{...},-
null
]

a内のいくつかの個々の要素がnullであるかどうかを確認することができます

reader.peek()== JsonToken.NULL

Logcatのエラー出力:

02-04 16:10:02.425: E/AndroidRuntime(1203): FATAL EXCEPTION: pool-1-thread-2
02-04 16:10:02.425: E/AndroidRuntime(1203): java.lang.IllegalStateException: Expected BEGIN_OBJECT but was NULL at line 1 column 327992
02-04 16:10:02.425: E/AndroidRuntime(1203):     at com.google.gson.stream.JsonReader.expect(JsonReader.java:339)
02-04 16:10:02.425: E/AndroidRuntime(1203):     at com.google.gson.stream.JsonReader.beginObject(JsonReader.java:322)

名前のない解析したい配列またはオブジェクトがNullであるかどうかを確認する方法がわかりません。

編集:

コード:

public ResultObject parse(){
    try{
        if(reader != null ){
            resultObject    =    new ResultObject();
            reader.beginObject();
            Log.e("123", "inside try ");
            while (reader.hasNext()) {
                String name = reader.nextName();
                if (name.equalsIgnoreCase("id")) {
                    if(reader.peek()== JsonToken.NULL){
                        reader.skipValue();
                        id=    0;
                        Log.e("123", "parse result --------id----------" + id);
                        resultObject.setId(id);
                    }else{
                        id= reader.nextDouble();
                        Log.e("123", "parse result -------id----------" + id);
                        resultObject.setId(id);
                    }
                } else {
                    Log.e("123", "skip value");
                    reader.skipValue();
                }
            }

            reader.endObject();
        }
    }catch(IOException e){ 
        e.printStackTrace();
    }

    return resultObject;
}

関数の呼び出し:

if (name.equalsIgnoreCase(SOURCE)) {
    if(reader.peek()== JsonToken.NULL){
        reader.skipValue();
    } else {
        resultObjectList = new ArrayList();
        resultObject    =    new ResultObject();
        reader.beginArray();
        while(reader.hasNext()){
            resultObject    =new ResultJsonUtil(reader).parse();
            if(resultObject!=null){
                resultObjectList.add(resultObject);
            }
        }

        reader.endArray();
    }
}
4

1 に答える 1

3

コードがでクラッシュreader.beginObject();するようです。オブジェクトがないため、Gsonは例外をスローします。

よくわからない場合は、次に何が来るか、これをテストできますpeek

次のトークンのタイプを消費せずに返します。

次に、取得したものに応じて適切なリーダーメソッドを呼び出すことができますJsonToken

if (reader.peek() != JsonToken.BEGIN_OBJECT) {
    // do something
} else {
    // parse object
    resultObject = new ResultObject();
    reader.beginObject();
    ...
}
于 2013-02-04T13:43:33.670 に答える