【问题标题】:Json Data Parsing problemsJson 数据解析问题
【发布时间】:2014-04-15 18:24:28
【问题描述】:

我现在在解析 JSON 数据时遇到问题。 我的 Json 数据有什么问题吗? 我找不到我的错误。 总是,如果我运行我的应用程序,这个应用程序也会崩溃,因为我的 json 是空的。

我的 Json:

{
"android":[
{
"ver": "1.5",
"name": "Cupcake",
"api": "API level 3"
},
{
"ver": "1.6",
"name": "Donut",
"api": "API level 4"
},
{
"ver": "2.0-2.1",
"name": "Eclair",
"api": "API level 5-7"
},
{
"ver": "2.2",
"name": "Froyo",
"api": "API level 8"
},
{
"ver": "2.3",
"name": "Gingerbread",
"api": "API level 9-10"
},
{
"ver": "3.0-3.2",
"name": "Honeycomb",
"api": "API level 11-13"
},
{
"ver": "4.0",
"name": "Ice Cream Sandwich",
"api": "API level 14-15"
},
{
"ver": "4.1-4.3",
"name": "JellyBean",
"api": "API level 16-18"
},
{
"ver": "4.4",
"name": "KitKat",
"api": "API level 19"
}
]
}

logcat 的输出:

Error parsing data org.json.JSONException: Unterminated array at character 15 of {n"android":[n{n"ver": "1.5",n"name": "Cupcake",n"api": "API level 3"n},n{n"ver": "1.6",n"name": "Donut",n"api": "API level 4"n},n{n"ver": "2.0-2.1",n"name": "Eclair",n"api": "API level 5-7"n},n{n"ver": "2.2",n"name": "Froyo",n"api": "API level 8"n},n{n"ver": "2.3",n"name": "Gingerbread",n"api": "API level 9-10"n},n{n"ver": "3.0-3.2",n"name": "Honeycomb",n"api": "API level 11-13"n},n{n"ver": "4.0",n"name": "Ice Cream Sandwich",n"api": "API level 14-15"n},n{n"ver": "4.1-4.3",n"name": "JellyBean",n"api": "API level 16-18"n},n{n"ver": "4.4",n"name": "KitKat",n"api": "API level 19"n}n]n}n

MainAct.:

import java.util.ArrayList;
import java.util.HashMap;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {
    ListView list;
    TextView ver;
    TextView name;
    TextView api;
    Button Btngetdata;
    ArrayList<HashMap<String, String>> oslist = new ArrayList<HashMap<String, String>>();
    //URL to get JSON Array
    private static String url = "*****";
    //JSON Node Names
    private static final String TAG_OS = "android";
    private static final String TAG_VER = "ver";
    private static final String TAG_NAME = "name";
    private static final String TAG_API = "api";
    JSONArray android = null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        oslist = new ArrayList<HashMap<String, String>>();
        Btngetdata = (Button)findViewById(R.id.getdata);
        Btngetdata.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                new JSONParse().execute();
            }
        });
    }
    private class JSONParse extends AsyncTask<String, String, JSONObject> {
        private ProgressDialog pDialog;
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            ver = (TextView)findViewById(R.id.vers);
            name = (TextView)findViewById(R.id.name);
            api = (TextView)findViewById(R.id.api);
            pDialog = new ProgressDialog(MainActivity.this);
            pDialog.setMessage("Getting Data ...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(true);
            pDialog.show();
        }
        @Override
        protected JSONObject doInBackground(String... args) {
            JSONParser jParser = new JSONParser();
            // Getting JSON from URL
            JSONObject json = jParser.getJSONFromUrl(url);
            return json;
        }
        @Override
        protected void onPostExecute(JSONObject json) {
            pDialog.dismiss();
            try {
                // Getting JSON Array from URL
                android = json.getJSONArray(TAG_OS);
                for(int i = 0; i < android.length(); i++){
                    JSONObject c = android.getJSONObject(i);
                    // Storing  JSON item in a Variable
                    String ver = c.getString(TAG_VER);
                    String name = c.getString(TAG_NAME);
                    String api = c.getString(TAG_API);
                    // Adding value HashMap key => value
                    HashMap<String, String> map = new HashMap<String, String>();
                    map.put(TAG_VER, ver);
                    map.put(TAG_NAME, name);
                    map.put(TAG_API, api);
                    oslist.add(map);
                    list=(ListView)findViewById(R.id.list);
                    ListAdapter adapter = new SimpleAdapter(MainActivity.this, oslist,
                            R.layout.list_v,
                            new String[] { TAG_VER,TAG_NAME, TAG_API }, new int[] {
                            R.id.vers,R.id.name, R.id.api});
                    list.setAdapter(adapter);
                    list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                        @Override
                        public void onItemClick(AdapterView<?> parent, View view,
                                                int position, long id) {
                            Toast.makeText(MainActivity.this, "You Clicked at "+oslist.get(+position).get("name"), Toast.LENGTH_SHORT).show();
                        }
                    });
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }
}

JSON解析器:

    import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONException;
import org.json.JSONObject;
import android.util.Log;
public class JSONParser {
    static InputStream is = null;
    static JSONObject jObj = null;
    static String json = "";
    // constructor
    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 parse the string to a JSON object
        try {
            jObj = new JSONObject(json);
        } catch (JSONException e) {
            Log.e("JSON Parser", "Error parsing data " + e.toString());
        }
        // return JSON String
        return jObj;
    }
}

【问题讨论】:

  • 检查出对我有效,您的错误输出中似乎有额外的“n”,而您上面列出的示例中没有。
  • 请分享您的代码

标签: android json parsing


【解决方案1】:

JSON 解析器需要一个字符串。如果您提供的是您发布的确切文本,java 会将其解析为未知对象数组。尝试将文本用引号括起来并转义新行。例如。

String JsonString = "{\n\"android\":[\n{\n\"ver\": \"1.5\",\n\"name\": \"Cupcake\",\n\"api\": \"API level 3\"\n}]}";

当然,这假设这不是您实际拥有的;毫无顾忌,您应该始终发布源代码,使其明确。

【讨论】:

    【解决方案2】:

    使用 JSONArray jObject = new JSONArray(jsonString);

    这是stackoverflow讨论,this one the doc

    【讨论】:

      【解决方案3】:

      您好,使用给定的函数进行解析,只需将完整的字符串传递给函数,它就会被测试为完全工作的代码!!

      public void parseJson(String s) throws JSONException {
      
              JSONObject object = new JSONObject(s);
              JSONArray jarray = object.getJSONArray("android");
              for (int i = 0; i < jarray.length(); i++) {
                  JSONObject jobject = jarray.getJSONObject(i);
                  String ver = jobject.getString("ver");
                  Log.d("ver=", ver);
                  String name = jobject.getString("name");
                  Log.d("name=", name);
                  String api = jobject.getString("api");
                  Log.d("api=", api);
              }
          }
      

      【讨论】:

        猜你喜欢
        • 2018-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多