0

我正在使用 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 就像教程中写的一样。

这里有 2 行 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)
4

4 回答 4

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 来解析 int 使用getInt(),然后将其余数组值解析为 JSONObjects 。

于 2012-08-16T17:00:29.990 回答
1

您的 JSON 示例是组织结果的一种糟糕方式:将数字与结果对象混合。数字应该表示数组中的对象数量还是其他?

如果您可以假设这个数字将始终是第一个元素,并且根据这个那么它应该以这种方式工作,您可以尝试在循环外读取数组的第一个值:

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()Stringint你解析。

请注意,数组中对象中的一些值也是数字,您可能还想阅读这些值int

int aid = c.getInt(TAG_AID);
int owner_id = c.getInt(TAG_OWNER_ID);
int duration = c.getInt(TAG_DURATION);
于 2012-08-16T17:06:28.313 回答
0

尝试改变

response = json.getJSONArray(TAG_RESPONSE);

进入

response = (JSONObject)json.getJSONArray(TAG_RESPONSE);

我对 JSONObject 没有任何经验,但经常处理类型不匹配的问题。

于 2012-08-16T16:57:30.487 回答
0

尝试将 50036 放在像这样的引号中 "50036" 。

于 2012-08-16T17:01:31.210 回答