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()を返して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

JSONTokenerjavadocをご覧ください。

ドキュメントによると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,
}
于 2013-02-18T08:17:23.147 に答える
1
 reply = (JSONObject) new JSONTokener(resp).nextValue();//CRASHES HERE

が返されるのはJSONObject(おそらくインスタンス)ではないClassCastExceptionためです。ObjectnextValue()String

于 2013-02-18T08:12:12.293 に答える