android - 从 Android 上的 URL 简单解析 JSON 并显示在 ListView 中

标签 android json

我正在尝试解析从我的 Android 应用中的 URL 获取的 JSON 结果...

我在 Internet 上尝试了一些示例,但无法正常工作。 JSON 数据如下所示:

[
    {
        "city_id": "1",
        "city_name": "Noida"
    },
    {
        "city_id": "2",
        "city_name": "Delhi"
    },
    {
        "city_id": "3",
        "city_name": "Gaziyabad"
    },
    {
        "city_id": "4",
        "city_name": "Gurgaon"
    },
    {
        "city_id": "5",
        "city_name": "Gr. Noida"
    }
]

获取 URL 并解析 JSON 数据的最简单方法是在 ListView 中显示它

最佳答案

您可以使用 AsyncTask,您必须进行自定义以满足您的需求,但类似于以下内容


异步任务有三种主要方法:

  1. onPreExecute() - 最常用于设置和启动进度对话框

  2. doInBackground() - 建立连接并从服务器接收响应(不要尝试将响应值分配给 GUI 元素,这是一个常见错误,无法在后台完成线程)。

  3. onPostExecute() - 这里我们脱离了后台线程,所以我们可以对响应数据进行用户界面操作,或者简单地将响应分配给特定的变量类型。

首先我们将启动类,初始化一个 String 以将结果保存在方法之外但在类内部,然后运行 ​​onPreExecute() 方法设置一个简单的进度对话框。

class MyAsyncTask extends AsyncTask<String, String, Void> {

    private ProgressDialog progressDialog = new ProgressDialog(MainActivity.this);
    InputStream inputStream = null;
    String result = ""; 

    protected void onPreExecute() {
        progressDialog.setMessage("Downloading your data...");
        progressDialog.show();
        progressDialog.setOnCancelListener(new OnCancelListener() {
            public void onCancel(DialogInterface arg0) {
                MyAsyncTask.this.cancel(true);
            }
        });
    }

然后我们需要设置连接以及我们希望如何处理响应:

    @Override
    protected Void doInBackground(String... params) {

        String url_select = "http://yoururlhere.com";

        ArrayList<NameValuePair> param = new ArrayList<NameValuePair>();

        try {
            // Set up HTTP post

            // HttpClient is more then less deprecated. Need to change to URLConnection
            HttpClient httpClient = new DefaultHttpClient();

            HttpPost httpPost = new HttpPost(url_select);
            httpPost.setEntity(new UrlEncodedFormEntity(param));
            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();

            // Read content & Log
            inputStream = httpEntity.getContent();
        } catch (UnsupportedEncodingException e1) {
            Log.e("UnsupportedEncodingException", e1.toString());
            e1.printStackTrace();
        } catch (ClientProtocolException e2) {
            Log.e("ClientProtocolException", e2.toString());
            e2.printStackTrace();
        } catch (IllegalStateException e3) {
            Log.e("IllegalStateException", e3.toString());
            e3.printStackTrace();
        } catch (IOException e4) {
            Log.e("IOException", e4.toString());
            e4.printStackTrace();
        }
        // Convert response to string using String Builder
        try {
            BufferedReader bReader = new BufferedReader(new InputStreamReader(inputStream, "utf-8"), 8);
            StringBuilder sBuilder = new StringBuilder();

            String line = null;
            while ((line = bReader.readLine()) != null) {
                sBuilder.append(line + "\n");
            }

            inputStream.close();
            result = sBuilder.toString();

        } catch (Exception e) {
            Log.e("StringBuilding & BufferedReader", "Error converting result " + e.toString());
        }
    } // protected Void doInBackground(String... params)

最后,在这里我们将解析返回,在这个例子中它是一个 JSON 数组,然后关闭对话框:

    protected void onPostExecute(Void v) {
        //parse JSON data
        try {
            JSONArray jArray = new JSONArray(result);    
            for(i=0; i < jArray.length(); i++) {

                JSONObject jObject = jArray.getJSONObject(i);

                String name = jObject.getString("name");
                String tab1_text = jObject.getString("tab1_text");
                int active = jObject.getInt("active");

            } // End Loop
            this.progressDialog.dismiss();
        } catch (JSONException e) {
            Log.e("JSONException", "Error: " + e.toString());
        } // catch (JSONException e)
    } // protected void onPostExecute(Void v)
} //class MyAsyncTask extends AsyncTask<String, String, Void>

关于android - 从 Android 上的 URL 简单解析 JSON 并显示在 ListView 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13196234/

相关文章:

javascript - 在对象数组中查找属性的最大值

java - 使用 Jakson 从 Spring 到网络的日期作为时间戳

android - 更改单选按钮的文本格式并获取所有国家/地区的列表并将其放入微调器 Android

找不到在 c 中解析我的 json 的方法

javascript - 为什么我可以让 console.log(variable) 给出我的值但不能返回变量?

android - 在 Android 上使用 OpenCV 预处理图像以优化 ocr 准确性

javascript - Gatsby.js - Express 服务器的代理

android - 在 Android 上对用户进行身份验证,但在远程服务器上进行处理?

android - 在 Textview android :text 中插入和符号

android - 任务 ':app:prepareDebugAndroidTestDependencies' 依赖错误执行失败