Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了android – org.json.JSONArray无法转换为JSONObject(从webservice填充微调器)大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
尝试解析 JSON数据时,我得到一个 JSON异常.

我已经查看了与此异常相关的相关问题,但我仍然无法提出解决方案.

这是来自webservice的Json数组

[
   {
      "created_at":"2013-03-18T21:30:19Z","id":1,"name":"latte","price":"5","updated_at":"2013-03-18T21:30:19Z"
   },{
      "created_at":"2013-03-18T21:30:41Z","id":11,"name":"black","price":"2","updated_at":"2013-03-18T21:30:41Z"
   },{
      "created_at":"2013-03-19T09:38:31Z","id":21,"name":"Tea","updated_at":"2013-03-19T09:39:02Z"
   }
]

这是使用解析器作为后台任务的类的相关部分

public class SpinnerDemo extends Activity {

    //JSON node names
    private static final String TAG_DATA = "data";
    private static final String TAG_CREATED_AT = "created_at";
    private static final String TAG_ID_DRINK = "id";
    private static final String TAG_NAME = "name";
    private static final String TAG_PRICE = "price";
    private static final String TAG_updatED_AT = "updated_at";
    private static final String MAP_API_URL = "http://notTheActualURl.com/drinks.json";
    private BACkGroundTask bgt;

    Spinner drinkField;

    ArrayList<Drink> drinkList = new ArrayList<Drink>();

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceStatE) {
        super.onCreate(savedInstanceStatE);
        setContentView(R.layout.spinner_main);
        buildDrinkDropDown();
    }

    private void buildDrinkDropDown() {

        List<NameValuePair> apiParams = new ArrayList<NameValuePair>(1);
        apiParams.add(new BasicNameValuePair("call","drinkList"));

        bgt = new BACkGroundTask(MAP_API_URL,"GET",apiParams);

        try {
            JSONObject drinkJSON = bgt.execute().get();
            // GetTing Array of drinks
            JSONArray drinks = drinkJSON.getJSONArray(tag_DATA);

            // looping through All drinks
            for (int i = 0; i < drinks.length(); i++) {

                JSONObject d = drinks.getJSONObject(i);

                // Storing each json item in variable

                String id = d.getString(tag_ID_DRINK);
                String createdAt = d.getString(tag_CREATED_AT);
                String updatedAt = d.getString(tag_updatED_AT);
                String price = d.getString(tag_PRICE);
                String name = d.getString(tag_Name);



                // add drink
                drinkList.add(new Drink( createdAt,id,name,price,updatedAt ));
            }

这是进行解析的实际类

package com.android.main;

import java.io.bufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.httpentity;
import org.apache.http.httpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.httpGet;
import org.apache.http.client.methods.httpPost;
import org.apache.http.client.utilS.URLEncodedUtils;
import org.apache.http.impl.client.DefaulthttpClient;
import org.json.JSONException;
import org.json.JSONObject;

import android.os.AsyncTask;
import android.util.Log;

public class BACkGroundTask extends AsyncTask<String,String,JSONObject> {

     List<NameValuePair> postparams = new ArrayList<NameValuePair>();
     String URL = null;
     String method = null;

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

     public BACkGroundTask(String url,String method,List<NameValuePair> params) {
      thiS.URL = url;
      this.postparams = params;
      this.method = method;
     }

     @Override
     protected JSONObject doInBACkground(String... params) {
      // TODO Auto-generated method stub
      // Making http request
      try {
       // Making http request
       // check for request method

       if (method.equals("POST")) {
        // request method is POST
        // defaulthttpClient
        DefaulthttpClient httpClient = new DefaulthttpClient();
        httpPost httpPost = new httpPost(URL);
        httpPost.setEntity(new UrlEncodedFormEntity(postparams));

        httpResponse httpResponse = httpClient.execute(httpPost);
        httpentity httpentity = httpResponse.getEntity();
        is = httpentity.getContent();

       } else if (method == "GET") {
        // request method is GET
        DefaulthttpClient httpClient = new DefaulthttpClient();
        String paramString = URLEncodedUtils
          .format(postparams,"utf-8");
        URL += "?" + paramString;
        httpGet httpGet = new httpGet(URL);

        httpResponse httpResponse = httpClient.execute(httpGet);
        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,"utf-8"),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 parse the String to a JSON object
      try {
       jObj = new JSONObject(json);
      } catch (JSONException E) {
       Log.e("JSON Parser","Error parsing data TEST " + e.toString());
      }

      // return JSON String
      return jObj;

     }
    }

这是log cat的例外

03-26 11:32:49.637: E/JSON Parser(714): Error parsing data TEST org.json.JSONException: Value [{"id":1,"created_at":"2013-03-18T21:30:19Z","updated_at":"2013-03-18T21:30:19Z","name":"latte"},{"id":11,"created_at":"2013-03-18T21:30:41Z","updated_at":"2013-03-18T21:30:41Z","name":"black"},{"id":21,"created_at":"2013-03-19T09:38:31Z","updated_at":"2013-03-19T09:39:02Z","name":"Tea"}] of type org.json.JSONArray cAnnot be converted to JSONObject

一个错误显示spinnerDemo类中的空点异常,尽管我认为这是前一个异常的结果

03-26 11:32:49.707: E/AndroidRuntime(714): java.lang.RuntimeException: Unable to start activity ComponenTinfo{Com.android.main/com.android.main.SpinnerDemo}: java.lang.NullPointerException

任何建议或帮助将非常感谢

解决方法

在日志中:

因为您将JSONArray作为根元素而不是JSONObject,但您正在尝试将其转换为JSONObject.
目前你正在关注json结构:

[     //<<<<<<<<< JSONArray
   {      //<<<<<<<<< JSONObject

   },....
]

您需要将json字符串转换为JSONArray,然后从中提取JSONObject

JSONArray drinkJSON = bgt.execute().get();

您还需要将doInBACkground方法返回类型更改为JSONArray

大佬总结

以上是大佬教程为你收集整理的android – org.json.JSONArray无法转换为JSONObject(从webservice填充微调器)全部内容,希望文章能够帮你解决android – org.json.JSONArray无法转换为JSONObject(从webservice填充微调器)所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。