0

以下是我的代码。它在模拟器上运行良好。但是当我在我的 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;
    }

}

4

3 回答 3

5

你已经展示了选角出错的地方——它在这里:

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

nextValue()正在返回 a String,而您将其转换为JSONObject.

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

您应该检查您返回的 JSON,或者更改为转换为字符串,或者如果您希望能够处理两种形式的 JSON,请instanceof在转换前检查结果:

Object reply = new JSONTokener(resp).nextValue();
if (reply instanceof String) {
   ...
} else if (reply instanceof JSONObject) {
   ...
}
于 2013-02-18T08:12:28.657 回答
2

你可能想看看JSONTokener javadoc

医生说nextValue()

获取下一个值。该值可以是 Boolean、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,
}
于 2013-02-18T08:17:23.147 回答
1
 reply = (JSONObject) new JSONTokener(resp).nextValue();//CRASHES HERE

如果你得到一个ClassCastException是因为Object返回的nextValue()不是 JSONObject (可能是一个String实例)

于 2013-02-18T08:12:12.293 回答