使用 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 为空的主要内容,如果未能解决你的问题,请参考以下文章