java.lang.ClassCastException:java.lang.String JSON Tokener android

时间:2013-02-18 08:08:51

标签: java android json casting classcastexception

以下是我的代码。它在模拟器上工作正常。但是当我在我的Android设备上运行它时,它崩溃了java.lang.ClassCastException:java.lang.String在下面标记的行。我找不到铸件出错的地方。任何帮助将不胜感激! :)

 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;
    }

}

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; } }

3 个答案:

答案 0 :(得分:5)

你已经展示了演员出错的地方 - 就在这里:

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

nextValue()正在返回String,您将其投放到JSONObject

我怀疑JSON并不像你期望的那样 - 它不是statusCode = "value"对;这只是价值。

您应该检查您要返回的JSON,并更改为强制转换为字符串,或者如果您希望能够处理两种形式的JSON,请在转换前使用instanceof检查结果:< / p>

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

答案 1 :(得分:2)

你可能想看看JSONTokener javadoc

文档说nextValue()

  

获取下一个值。值可以是布尔值,Double,Integer,   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,
}

答案 2 :(得分:1)

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

如果您收到ClassCastException,那是因为Object返回的nextValue()不是JSONObject(可能是String个实例)