2013-04-12 34 views
1

因此,我正在研究一个Android应用程序,它将从远程服务器(运行PHP)读取JSON响应。一切正常,直到我尝试从较大的JSON字符串读取数组数据项。下面是Eclipse在尝试将对象分析到数组中时抛出的错误。有人有主意吗? JSONLint验证这个数组是有效的JSON,所以我不确定这里的问题是什么。
注意 - 它是否让我把这个元素解析为一个JSONObject,但我不清楚如何从它那里得到它到像我需要的关联数组。我确实看到JSONObject有一个方法ToJSONArray,但它需要一个数组键,但这些变量是可变的,我不知道它们是什么,直到我解析该死的数组!任何援助表示赞赏。从字符串中解析JSON数组问题

public JSONArray parseJson(String jsonString) { 

    JSONArray data = new JSONArray(); 
    try { 
     JSONObject json = new JSONObject(jsonString); 
     success = json.getBoolean("success"); 
     object = json.getString("object"); 
     message = json.getString("message"); 

     data = json.getJSONArray("data") 


    } catch (JSONException e) { 
     Log.e("ServerResponse::parseJson", e.getMessage()); 
     e.printStackTrace(); 
     success = false; 
     message = "Error parsing return JSON data. " + e.getCause(); 
    } 
    return data; 
} 

这里的JSON数组我试图解析:

{ 
"1": { 
    "country_of_origin": "US", 
    "genre": "Action", 
    "date_finished": "2005-06-17", 
    "dtimemod": "2009-12-03 14:29:59", 
    "netflix_rating": "82", 
    "table": "movies", 
    "rotten_rating": "82", 
    "format": "Live Action", 
    "date_begun": "2005-06-17", 
    "id": "3055", 
    "dtimecre": "2009-12-03 14:29:59", 
    "name": "Batman Begins", 
    "user_id": "mcenci", 
    "year": "2005", 
    "actors": "Christian Bale, Michael Caine, Liam Neeson, Morgan Freeman, Gary Oldman, Ken Watanabe, Katie Holmes, Cillian Murphy, Tom Wilkinson, Rutger Hauer, Sara Stewart, Richard Brake, Gus Lewis", 
    "rating": "100", 
    "extra_info": "Runtime: 140 min\n", 
    "public": "0", 
    "notes": "", 
    "key": "103", 
    "genre2": "Sci-Fi" 
} 
} 
+1

“下面是错误的Eclipse抛出”< - 你忘了实际包括。 –

回答

0

您的JSONObject实际上是一个数组,其中第一对象密钥是1 尝试:

JSONObject json = new JSONArray(jsonString).getJSONObject(0); 
// or JSONObject json = new JSONObject(jsonString).getJSONObject("1"); 
success = json.getBoolean("success"); 
object = json.getString("object"); 
message = json.getString("message"); 

data = json.getJSONArray("data") 

运作的?

+0

类型...我可以使用json.getJSONObject(“data”)。getJSONObject(“1”)来获取我的数组的第一个元素。但是这要求我知道密钥名是什么 - 即1 ...在这种情况下密钥实际上是数据库唯一标识符,直到以后我才知道。没有办法在不知道密钥被调用的情况下创建关联数组? – mcenci

+0

[JSONObject](http://www.json.org/javadoc/org/json/JSONObject.html)有一个方法.keys(),它将返回您可以使用的对象中枚举的键。 – drunkenRabbit

+0

太棒了!正是我需要的感谢! – mcenci

1

您的JSON是不是一个数组。

它是一个包含名为“1”的单个对象的对象,其中包含许多属性。在JSON,阵列始于[并用]例如结束:

{ "myStringArray" : [ "adsf", "qwer" ] } 

{ "myObjectArray" : [ 
    { "prop1" : "asdf", "prop2" : "qwer" }, 
    { "prop1" : "zxcv", "prop2" : "qwer" } 
]} 

进一步说,我建议不使用的JSONObject/JSONArray东西,并使用能够库。我更喜欢杰克逊,但是当我评估它时,我发现它对于把它放在android项目中感觉很好,所以我和GSON一起去了。

有了一个更好的图书馆,你可以在对象映射到一个Map<String, Object>,或者如果你给的样品表明你的数据将永远喜欢你可以把它映射到Map<String, String>