当前位置: 首页 > 面试题库 >

在Android上从URL简单解析JSON并显示在列表视图中

孟意致
2023-03-14
问题内容

我正在尝试解析从我的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数据的最简单方法是在列表视图中显示它


问题答案:

您可以使用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>


 类似资料:
  • 这是我的代码,我们在MainActivity中使用。我在主活动中使用以下代码,但它显示空指针异常。 这是http代码... 这是logcat中显示的错误.... 04-26 05:54:40.534 5884-5884/com.example.converbiz.apidemo E/AndroidRuntime: 致命异常: main java.lang.NullPointerException

  • 我知道我的问题已经被问了很多,但是我花了相当多的时间搜索了SO和谷歌,试图更好地理解这个概念,但没有成功。我见过许多不同的实现,这也让我得到了一些关于我的具体情况的建议。 我的目标 我需要对php文件执行post请求,目标是最终用一些json数据填充列表活动中的字段。 HTTP POST响应 这是我从服务器返回的响应数据的格式,它似乎是数组的JSON对象(?)。 第一个问题 下面的代码是我用来阅读

  • 问题内容: 这是我正在处理的代码: 我想在列表视图上显示它们。您有任何教程可以帮助我入门吗?我是Web服务的新手。谢谢。 问题答案: 列表视图中最受欢迎的教学作品之一,可能会帮助您: - 拉维的博客 解析json之后要执行的步骤: 您可以使用jackson库用一行代码来解析json。 (单击此链接以获取有关对象映射教程的更多信息)

  • 问题内容: 我在Angular中显示JSON数据时遇到麻烦。我已成功将数据从后端发送到前端(角度),但无法显示它们。 我已经尝试在JSFiddle上模拟类似的情况,尽管我已经从后端准备了数据 获取/发送数据->后端: 获取数据->前端(角度) 带有ng-repeat指令的HTML部分: 谁知道是什么问题吗? 问题答案: 据我所知,您将对象存储为JSON,但从未对其进行解析。因此使用 代替 应该解决

  • 我想在android应用程序中显示视频。我在谷歌上搜索了一下,发现了下面的代码 VideoView VideoView=(VideoView)findViewById(r.id.VideoView); 谢谢 编辑:经过一些工作,我知道其中一个原因是Android版本4.0.3。上面提到的代码仅适用于4.2.2中的示例url(如http://download.itcuties.com/teaser/