2013-02-18 5 views
0

Следующий мой код. Он отлично работает на эмуляторе. Но когда я запускаю его на своем устройстве Android, он выходит из строя с помощью java.lang.ClassCastException: java.lang.String на строке, указанной ниже. Я не могу найти место, где кастинг пошел не так. Любая помощь будет принята с благодарностью! :) java.lang.ClassCastException: java.lang.String JSON Tokener android

public static MatrixCursor getRespAsCursor(String query) { 
    String url = (String)(API_URL + "?api_key=" + API_KEY + "&" + query); 
    System.out.println(url); 
    String resp = (String)getAPIResp(url); 
    JSONObject reply; 
    MatrixCursor emptyCursor = new MatrixCursor(new String[0]); 

    try { 
     reply = (JSONObject) new JSONTokener(resp).nextValue();//CRASHES HERE 
     String statusCode = (String)reply.getString("statusCode"); 
     if(!statusCode.equals("200")) { 
      return emptyCursor; 
     } 
     int count = Integer.parseInt(reply.getString("count")); 
     if(count < 1) { 
      return emptyCursor; 
     } 

     JSONArray data = reply.getJSONArray("data"); 

     //Get keys in String[] format 
     Iterator<String> keys = data.optJSONObject(0).keys(); 
     List<String> copy = new ArrayList<String>(); 

     //Add "_id" as adapters need it for traversal 
     copy.add("_id"); 

     //copy rest of the keys 
     while (keys.hasNext()) 
      copy.add(keys.next()); 
     String[] sKeys = new String[copy.size()]; 
     copy.toArray(sKeys); 

     int len = data.length(); 

     //Create Cursor with JSON keys as columns 
     MatrixCursor resultCursor = new MatrixCursor(sKeys, len); 

     //Add rows to Cursor 
     for(int i = 0; i < len; i++) { 
      JSONObject d = data.optJSONObject(i); 
      List<Object> values = new ArrayList<Object>(); 
      for(String key: copy) { 
       if(key.equals("_id")) { 
        values.add(Integer.toString(i)); 
       } 
       else { 
        values.add(d.opt(key)); 
       } 
      } 
      resultCursor.addRow(values); 
     } 

     return resultCursor; 
    } 
    catch(JSONException e) { 
     return emptyCursor; 
    } 

} 

+0

ли вы напечатать 'resp' значение, чтобы убедиться, что это действительный' JSON', как вы ожидали? – iTech

ответ

5

Вы уже показали место, кастинг идет не так - это здесь:

reply = (JSONObject) new JSONTokener(resp).nextValue(); 

nextValue() возвращается в String, и вы литья его JSONObject.

Я подозреваю, что JSON не так, как вы ожидаете, это не пара statusCode = "value"; это просто ценность.

Вы должны проверить JSON, что вы возвращаете, и либо изменить, чтобы бросить в строку, или если вы хотите, чтобы иметь возможность обрабатывать обе формы JSON, проверьте результат с instanceof перед заливкой:

Object reply = new JSONTokener(resp).nextValue(); 
if (reply instanceof String) { 
    ... 
} else if (reply instanceof JSONObject) { 
    ... 
} 
+0

Спасибо тонну !! :) – Namratha

+0

Он возвращает JSONObject в случае эмулятора, но String в случае устройства. Почему это? – Namratha

+0

@Namratha: Я подозреваю, что вы получаете разные JSON в 'resp'. Вы должны сначала изучить это. –

1
reply = (JSONObject) new JSONTokener(resp).nextValue();//CRASHES HERE 

Если вы получаете ClassCastException потому, что Object возвращаемый nextValue() не JSONObject (вероятно String экземпляр)

2

Вы могли бы хотеть взглянуть на JSONTokener javadoc

Док говорит nextValue()

Получить следующее значение. Значение может быть логическим, двойным, целочисленным, объектами JSONArray, JSONObject, Long или String или объектом JSONObject.NULL.

Вы, вероятно, получаете ClassCastException в качестве строки кода

reply = (JSONObject) new JSONTokener(resp).nextValue();//CRASHES HERE 

не возвращает JSONObject.

Возможно, вы захотите проверить тип экземпляра возвращаемого объекта перед его приведением в тип. Например,

Object obj = new JSONTokener(resp).nextValue(); 
if(obj instanceof JSONObject){ 
    reply = (JSONObject)obj; 
} else { 
    //Handle otherwise, 
}