使用 JsonReader 解析时 JsonArray 或 JsonObject 为空

Posted

技术标签:

【中文标题】使用 JsonReader 解析时 JsonArray 或 JsonObject 为空【英文标题】:JsonArray Or JsonObject is null while parsing with JsonReader 【发布时间】:2013-02-04 10:43:05 【问题描述】:

我正在尝试使用 JsonReader 解析 json。在解析时,我遇到了我的应用程序崩溃的 2 个场景。 1)。当 JsonArray 包含另一个 JsonArrays 的集合并且其中一个为空时。我给出了一个场景,其中结果是一个数组,其中还有 21 个数组,最后一个数组为空。

"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 中有一组对象并且其中一个对象为空时。我已经附上了同样的例子。这里我有源作为我的 JsonArray,它包含 21 个对象,其中 1 个为空。

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

我可以通过

检查 a 中的某些单个元素何时为空
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();
    

【问题讨论】:

请显示您的代码,它在哪里崩溃。 @OlafDietsche - 我已经添加了对象为空的情况 2 的代码。 【参考方案1】:

您的代码似乎在reader.beginObject(); 崩溃了。由于没有对象,Gson 抛出异常。

如果您不确定接下来会发生什么,您可以使用peek 进行测试

返回下一个令牌的类型而不使用它。

然后可以根据检索到的JsonToken调用正确的reader方法

if (reader.peek() != JsonToken.BEGIN_OBJECT) 
    // do something
 else 
    // parse object
    resultObject = new ResultObject();
    reader.beginObject();
    ...

【讨论】:

以上是关于使用 JsonReader 解析时 JsonArray 或 JsonObject 为空的主要内容,如果未能解决你的问题,请参考以下文章

JsonReader 无法正确解析字符串数组

Jsonreader 解析错误

如何使用 JsonReader 跳过不需要的值?

Gson全解析之一:JsonReader的beginObject()

Gson全解析之二:JsonReader的其它方法

JsonReader - 读取数组抛出预期名称但为 NULL