我该怎么做才能解决这个错误?

时间:2012-08-16 16:53:00

标签: java android json parsing

我使用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)

4 个答案:

答案 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”。