ClassCastException - 与JSON解析相关,无处不在

时间:2013-04-17 03:37:13

标签: android classcastexception

我的应用程序现在看起来运行正常了一段时间,突然间,当运行通过REST API运行查询的应用程序的一部分时,我开始得到ClassCastException。我不知道它来自何处或为什么它现在出现,因为它正在工作一瞬间,然后当我重新运行它以测试不同的搜索查询时,它遇到了错误。错误指向以下方法,特别是try块中的第一行 - JSONObject resultsWrapper = (JSONObject) new JSONTokener(json).nextValue();

    private static void getResultsFromJson(String json) {
    try {
        JSONObject resultsWrapper = (JSONObject) new JSONTokener(json).nextValue(); 
        JSONArray  results        = resultsWrapper.getJSONArray("results");

        for (int i = 0; i < results.length(); i++) {
            JSONObject result = results.getJSONObject(i);

            String name = result.getString("from_user"); 
            String geo = result.getString("text");  

            VenueList.addVenue(name, geo);
        }
    } catch (JSONException e) {
        Log.e(TAG, "Failed to parse JSON.", e);
    }
}

完全披露:VenueList是一个用于存储从结果返回的数据的类,可以全局访问。如果认为有必要,我可以发布代码。

错误也指向以下方法,与上面的方法相同,特别是调用getResultsFromJson(restResult)的方法:

public void onRESTResult(int code, String restResult) { 
    if (code == 200 && restResult != null) {

        getResultsFromJson(restResult);
        mResults = VenueList.venueNames;
        setResults();           
    }
    else {
        Activity activity = getActivity();
        if (activity != null) {
            Toast.makeText(activity, "Failed to load Twitter data. Check your internet settings.", Toast.LENGTH_SHORT).show();
        }
    }
}

最后,上面两个方法都在Fragment中,扩展了下面的Fragment,其中错误指向`onRESTResult(resultCode,resultData.getString(RESTService.REST_RESULT));':

public abstract class RESTResponderFragment extends Fragment {

private ResultReceiver mReceiver;

public RESTResponderFragment() {
    mReceiver = new ResultReceiver(new Handler()) {

        @Override
        protected void onReceiveResult(int resultCode, Bundle resultData) {
            if (resultData != null && resultData.containsKey(RESTService.REST_RESULT)) {
                onRESTResult(resultCode, resultData.getString(RESTService.REST_RESULT));
            }
            else {
                onRESTResult(resultCode, null);
            }
        }

    };
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setRetainInstance(true);
}

public ResultReceiver getResultReceiver() {
    return mReceiver;
}

abstract public void onRESTResult(int code, String result);
}

以下是完整的错误日志:

04-16 22:20:16.270: E/AndroidRuntime(17906): FATAL EXCEPTION: main
04-16 22:20:16.270: E/AndroidRuntime(17906): java.lang.ClassCastException: java.lang.String
04-16 22:20:16.270: E/AndroidRuntime(17906):    at com.example.blobtag2.fragment.FactualResponderFragment.getResultsFromJson(FactualResponderFragment.java:152)
04-16 22:20:16.270: E/AndroidRuntime(17906):    at com.example.blobtag2.fragment.FactualResponderFragment.onRESTResult(FactualResponderFragment.java:106)
04-16 22:20:16.270: E/AndroidRuntime(17906):    at com.example.blobtag2.fragment.RESTResponderFragment$1.onReceiveResult(RESTResponderFragment.java:23)
04-16 22:20:16.270: E/AndroidRuntime(17906):    at android.os.ResultReceiver$MyRunnable.run(ResultReceiver.java:43)
04-16 22:20:16.270: E/AndroidRuntime(17906):    at android.os.Handler.handleCallback(Handler.java:587)
04-16 22:20:16.270: E/AndroidRuntime(17906):    at android.os.Handler.dispatchMessage(Handler.java:92)
04-16 22:20:16.270: E/AndroidRuntime(17906):    at android.os.Looper.loop(Looper.java:150)
04-16 22:20:16.270: E/AndroidRuntime(17906):    at android.app.ActivityThread.main(ActivityThread.java:4358)
04-16 22:20:16.270: E/AndroidRuntime(17906):    at java.lang.reflect.Method.invokeNative(Native Method)
04-16 22:20:16.270: E/AndroidRuntime(17906):    at java.lang.reflect.Method.invoke(Method.java:507)
04-16 22:20:16.270: E/AndroidRuntime(17906):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:849)
04-16 22:20:16.270: E/AndroidRuntime(17906):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:607)
04-16 22:20:16.270: E/AndroidRuntime(17906):    at dalvik.system.NativeStart.main(Native Method)

这是在我得到关于项目无法构建的错误的同时 - “在构建期间发生错误。在项目中运行构建器'Android Package Builder'的错误”。

如果有任何其他可能有用的代码,请告诉我。真的很困惑,因为这完全是冒出来的,会喜欢任何人可能对如何解决这个和/或它为什么会产生的任何见解。谢谢!

1 个答案:

答案 0 :(得分:0)

nextValue返回JSONObject,JSONArray,String,Boolean,Integer,Long,Double或NULL。

所以它并不总是一个JSONObject。如果是其他类型之一,那就是非法演员。

我处理JSON的常用方法是将字符串直接传递给JSONObject,然后解析JSONObject。但是如果你期待长串,那将是低效的。如果要使用标记化器,则需要通过instanceof检查数据类型。