【问题标题】:java.lang.ClassCastException: java.lang.String JSON Tokener androidjava.lang.ClassCastException: java.lang.String JSON Tokener android
【发布时间】:2013-02-18 08:08:50
【问题描述】:

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

}

【问题讨论】:

  • 您是否打印了resp 值以确保它是您期望的有效JSON

标签: java android json casting classcastexception


【解决方案1】:

你已经展示了投射出错的地方 - 它就在这里:

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) {
   ...
}

【讨论】:

  • 在模拟器的情况下返回一个 JSONObject,在设备的情况下返回一个字符串。这是为什么呢?
  • @Namratha:我怀疑你在resp 中得到了不同的 JSON。你应该先调查一下。
【解决方案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,
}

【讨论】:

    【解决方案3】:
     reply = (JSONObject) new JSONTokener(resp).nextValue();//CRASHES HERE
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-07
      • 2012-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-30
      • 2012-02-09
      • 2016-09-05
      相关资源
      最近更新 更多