简体   繁体   中英

Json Data Parsing problems

I have a problem now with parsing JSON Data. Is there anythin wrong with my Json Data or whats going on, I can't find my mistake. ALways if I run my app this one also crashes because my json is empty.

My 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"
}
]
}

Output from 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();
            }
        }
    }
}

JSONParser:

    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;
    }
}

The JSON parser expects a string. If you are providing the exact text you posted this is parsed by java as an array of unknown objects. Try wrapping your text in quotes and escaping the new lines. ex.

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

Of course this makes the assumption that this isn't what you actually have; reguardless, you should always post the source so that it is explicit.

use JSONArray jObject = new JSONArray(jsonString);

this is stackoverflow discussion, and this one the doc

Hi use given function for parsing, just pass the complete string to the function and it is tested fully working code!!

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);
        }
    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM