我使用JSONParser来获取搜索结果,因为我遵循了本教程:http://www.androidhive.info/2012/01/android-json-parsing-tutorial/
问题是,我使用的API给出了如下结果:
{"response":[50036,{"aid":88131498,"owner_id":61775052,"artist":"Terror Squad","title":"Lean Back (OST Need For Speed Underground 2)","duration":249,"url":"http:\/\/cs4408.vkontakte.ru\/u59557424\/audio\/7f70f58bb9b8.mp3","lyrics_id":"3620730"},{"aid":106963458,"owner_id":-24764574,"artist":"«Dr. Dre ft Eminem, Skylar Grey (Assault Terror)","title":"I Need A Doctor (ASSAULT TERROR DUBSTEP REMIX)»","duration":240,"url":"http:\/\/cs5101.vkontakte.ru\/u79237547\/audio\/12cd12c7f8c2.mp3","lyrics_id":"10876670"}]}
当我必须解析第一个整数(这里是50036)时,我的问题就来了,这是找到的结果数。
我不知道如何读取整数。
这是我的代码:
private void instance(String artisttrack){
// Creating JSON Parser instance
JSONParser jParser = new JSONParser();
// getting JSON string from URL
String jsonurl = new String( "https://api.vk.com/method/audio.search?access_token=ACC_TOKEN&api_id=ID&sig=SIG&v=2.0&q=" + artistname + artisttrack + "&count=5");
JSONObject json = jParser.getJSONFromUrl(jsonurl);
try {
// Getting Array of Contacts
response = json.getJSONArray(TAG_RESPONSE);
// looping through All Contacts
for(int i = 0; i < response.length(); i++){
JSONObject c = response.getJSONObject(i);
// Storing each json item in variable
//int results = Integer.parseInt(c.getString(TAG_RESULTS));
String aid = c.getString(TAG_AID);
String owner_id = c.getString(TAG_OWNER_ID);
String artist = c.getString(TAG_ARTIST);
String title = c.getString(TAG_TITLE);
String duration = c.getString(TAG_DURATION);
// Phone number is agin JSON Object
//JSONObject phone = c.getJSONObject(TAG_PHONE);
String url = c.getString(TAG_URL);
String lyrics_id = c.getString(TAG_LYRICS_ID);
Log.e("áaaaaaaaaaaaaaa", url);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
JSONParser.java就像在教程中编写的那样。
这里有两行logcat错误:
W/System.err(10350): org.json.JSONException: Value 50036 at 0 of type java.lang.Integer cannot be converted to JSONObject
W/System.err(10350): at org.json.JSON.typeMismatch(JSON.java:100)
答案 0 :(得分:1)
您尝试解析的许多值不是String
个对象,特别是“aid”,“owner_id”和“duration”。使用正确的方法检索值。例如:
int aid = c.getInt(TAG_AID);
int owner_id = c.getInt(TAG_OWNER_ID);
String artist = c.getString(TAG_ARTIST);
String title = c.getString(TAG_TITLE);
int duration = c.getInt(TAG_DURATION);
编辑:我错过的另一个错误是您使用50036启动数组。这不是JSONObject,因此无法解析。您可以添加一个条件语句来检查它的数组索引0是否使用getInt()
解析int,然后为其余的数组值解析为JSONObjects。
答案 1 :(得分:1)
您的JSON示例是组织结果的一种不好的方法:将数字与结果对象混合在一起。该数字应该表示数组中的对象数量还是其他什么?
如果你可以假设这个数字永远是第一个元素,并且根据this那么它应该以这种方式工作,你可以尝试在循环外读取数组的第一个值:
response = json.getJSONArray(TAG_RESPONSE);
// from your example, num will be 50036:
num = response.getInt(0);
for (int i = 1; i < response.length(); i++){
JSONObject c = response.getJSONObject(i);
请注意,链接文档中的示例将此数字作为字符串:
{"response":
["5",
{"aid":"60830458","owner_id":"6492","artist":"Noname","title":"Bosco",
"duration":"195","url":"http:\/\/cs40.vkontakte.ru\/u06492\/audio\/2ce49d2b88.mp3"},
{"aid":"59317035","owner_id":"6492","artist":"Mestre Barrao","title":"Sinhazinha",
"duration":"234","url":"http:\/\/cs510.vkontakte.ru\/u2082836\/audio\/
d100f76cb84e.mp3"}]}
但是JSONArray.getInt()
会将String
解析为int
。
请注意,数组中对象中的某些值也是数字,您可能还想将它们读作int
:
int aid = c.getInt(TAG_AID);
int owner_id = c.getInt(TAG_OWNER_ID);
int duration = c.getInt(TAG_DURATION);
答案 2 :(得分:0)
尝试更改
response = json.getJSONArray(TAG_RESPONSE);
进入
response = (JSONObject)json.getJSONArray(TAG_RESPONSE);
我对JSONObject没有任何经验,但经常使用类型不匹配。
答案 3 :(得分:0)
尝试将50036放在引号中,例如“50036”。