错误JSONArray无法转换为JSONObject

时间:2014-03-19 10:28:28

标签: java android json

我创建了一个应用程序来解析从服务器到我的应用程序的Json数据。但是现在当我运行项目时,我得到一个JSONArray无法转换为JSONObject异常。我在LogCat视图中获取所有服务器数据,但在应用程序中没有。我试过不同的方法,但没有运气。 谢谢。

//这是我的主要代码

    public class jsonExample2 extends Activity{
            // This is the url that i try to get data
        private static String url = "http://api.worldbank.org/countries/ir?format=json";
        private static final String PAGE = "page";
        private static final String VALUE = "value";
        private static final String NAME = "name";
        private static final String GEO = "region";

        JSONArray page = null;
            @Override
            protected void onCreate(Bundle savedInstanceState) {

                super.onCreate(savedInstanceState);
                setContentView(R.layout.activitybw);
                new GetJSONTask().execute(url);

            }

            class GetJSONTask extends AsyncTask<String, Void, JSONObject> {

                protected JSONObject doInBackground(String... urls) {
                    try {
                        JSONParser jParser = new JSONParser();
                        return jParser.getJSONFromUrl(urls[0]);
                    } catch (Exception e) {
                        return null;
                    }
                }

                protected void onPostExecute(JSONObject json) {
                    // do all the parsing here:
                    try {

                        page = json.getJSONArray(PAGE);
                        JSONObject c = page.getJSONObject(0);


                        String value = c.getString(VALUE);
                        String name = c.getString(NAME);
                        String geo = c.getString(GEO);

                        final TextView id1 = (TextView) findViewById(R.id.id);
                        final TextView name1 = (TextView) findViewById(R.id.name);
                        final TextView geo1 = (TextView) findViewById(R.id.geo);

                        id1.setText(value);
                        name1.setText(name);
                        geo1.setText(geo);
                    }
                    catch (JSONException e)
                    {
                        e.printStackTrace();
                    }
                } 
           }        
    }

// JSONParser类

    public class JSONParser {

        static InputStream is = null;
        static JSONObject jObj = null;
        static String json = "";

        public JSONParser() {

        }

        public JSONObject getJSONFromUrl(String url) {

            // Making HTTP request
            try {
                // defaultHttpClient
                DefaultHttpClient httpClient = new DefaultHttpClient();
                HttpPost httpPost = new HttpPost(url);

                HttpResponse httpResponse = httpClient.execute(httpPost);
                HttpEntity httpEntity = httpResponse.getEntity();
                is = httpEntity.getContent();           

            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

            try {
                BufferedReader reader = new BufferedReader(new InputStreamReader(
                        is, "iso-8859-1"), 8);
                StringBuilder sb = new StringBuilder();
                String line = null;
                while ((line = reader.readLine()) != null) {
                    sb.append(line + "\n");
                }
                is.close();
                json = sb.toString();
            } catch (Exception e) {
                Log.e("Buffer Error", "Error converting result " + e.toString());
            }

            try {
                jObj = new JSONObject(json);
            } catch (JSONException e) {
                Log.e("JSON Parser", "Error parsing data " + e.toString());
            }
            return jObj;
        }

    }

//这是我的logCat视图

    03-19 09:11:52.776: D/dalvikvm(1376): GC_CONCURRENT freed 129K, 10% free 2629K/2904K, paused 75ms+101ms, total 286ms
    03-19 09:11:52.846: E/JSON Parser(1376): Error parsing data org.json.JSONException: Value [{"total":1,"page":1,"per_page":"50","pages":1},[{"region":{"value":"Middle East & North Africa (all income levels)","id":"MEA"},"id":"IRN","incomeLevel":{"value":"Upper middle income","id":"UMC"},"name":"Iran, Islamic Rep.","iso2Code":"IR","lendingType":{"value":"IBRD","id":"IBD"},"longitude":"51.4447","latitude":"35.6878","capitalCity":"Tehran","adminregion":{"value":"Middle East & North Africa (developing only)","id":"MNA"}}]] of type org.json.JSONArray cannot be converted to JSONObject
    03-19 09:11:52.846: D/AndroidRuntime(1376): Shutting down VM
    03-19 09:11:52.855: W/dalvikvm(1376): threadid=1: thread exiting with uncaught exception (group=0x40a71930)
    03-19 09:11:52.876: E/AndroidRuntime(1376): FATAL EXCEPTION: main
    03-19 09:11:52.876: E/AndroidRuntime(1376): java.lang.NullPointerException
    03-19 09:11:52.876: E/AndroidRuntime(1376):     at com.example.mediaplayerapp.jsonExample2$GetJSONTask.onPostExecute(jsonExample2.java:79)

1 个答案:

答案 0 :(得分:1)

  try {
     jObj = new JSONObject(json);
  } catch (JSONException e) {
     Log.e("JSON Parser", "Error parsing data " + e.toString());
  }
这是错的。您收到的是JSONArray,但您要将其转换为JSONObject

中改变它
try {
     if (json != null)
       return new JSONArray(json);
  } catch (JSONException e) {
     Log.e("JSON Parser", "Error parsing data " + e.toString());
  }