2011-08-18 90 views
6

我的JSONObject的代码片段的结果,但是,有时候,我值不开始1,我有这样的一个错误:测试是否getJSONArray为空或不是

org.json.JSONException: No value for 1 

我的代码:

JSONObject obj = new JSONObject(result); 
     for(int i=1;i<=14;i++) { 

      JSONArray arr = obj.getJSONArray(""+i); 
     extraction(arr, i); 
     } 

如果对象代码(i)存在与否,我想在提取之前测试。我怎么能做到这一点?

+0

我可能是错的,但它不应该是从零开始的索引? –

回答

12

使用obj.optJSONArray(name)如果名称不存在,则响应将为空。

JSONObject obj = new JSONObject(result); 
    for(int i=1;i<=14;i++) { 

     JSONArray arr = obj.optJSONArray(""+i); 
     if(arr != null) { 
       extraction(arr, i); 
     } 
    } 
+0

这行:JSONArray arr = obj.optJSONArray(“”+ i); 对错误负责,并停止代码。它永远不会到达“如果”。我如何测试它是否为空? – toshiro92

+4

您需要了解getJSONArray和optJSONArray之间的区别。如果键不存在,第一个崩溃,第二个返回null,您可以测试。 – njzk2

+0

@ njzk2是对的 – Kevin

3

使用JSONObject.optJSONArray(key).

如文档中所指出的,它返回的情况下,空的键不存在。

另外,你的JSON结构看起来很奇怪。为什么你在对象中有数字有序键?不应该是一个数组?

+0

我的代码的特殊性,我需要一个int来检索数据库中的数据 – toshiro92

0

您不能使用.length()来检查JSONArray的返回null。 使用.isNull( “XXX”)来代替。长度(),示例低于:

JSONArray magazineLove = null; 
if(!socialBook.getJSONObject(i).isNull("MagazineLove")) 
{ 
    magazineLove = socialBook.getJSONObject(i).getJSONArray("MagazineLove");     
} 

Aey.Sakon