【问题标题】:How to put JSON information in an array to use it for displaying in ListView如何将 JSON 信息放入数组中以用于在 ListView 中显示
【发布时间】:2013-11-08 21:01:25
【问题描述】:

我有一个包含三个片段的活动,我正在尝试从我的服务器中检索一个 JSON 文件,我将每天更新该文件。

我的 JSON 文件位于此处:http://pagesbyz.com/test.json

因为有片段,所以我在MainActivity类中使用了如下代码:

DefaultHttpClient   httpclient = new DefaultHttpClient(new BasicHttpParams());
        HttpPost httppost = new HttpPost("http://pagesbyz.com/test.json");
        // Depends on your web service
        httppost.setHeader("Content-type", "application/json");

        InputStream inputStream = null;
        String result = null;
        try {
            HttpResponse response = httpclient.execute(httppost);           
            HttpEntity entity = response.getEntity();

            inputStream = entity.getContent();
            // json is UTF-8 by default
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"), 8);
            StringBuilder sb = new StringBuilder();

            String line = null;
            while ((line = reader.readLine()) != null)
            {
                sb.append(line + "\n");
            }
            result = sb.toString();
            Toast.makeText(getApplicationContext(), result, 2000).show();
        } catch (Exception e) { 
            // Oops
        }
        finally {
            try{if(inputStream != null)inputStream.close();}catch(Exception squish){}
        }

我真正需要做的是在我的 JSON 文件中检索 TYPE 字段并将其分成三个选项卡,然后将其放入 ListView 中,如下所示:

我想知道,一旦我使用上面的代码阅读了 JSON 文件,我该如何继续……感谢您的帮助 :)

我应该查询每个片段然后查找 TYPE 字段吗?那会更容易吗?

很好奇为什么 Toast 没有执行...这是我的主要活动的粘贴箱:http://pastebin.com/gKTCeH79

【问题讨论】:

  • 使用 JSON(反)序列化框架,例如 org.jsongsonJackson。此外,我强烈建议您不要在 UI 线程上执行网络操作,您似乎正在这样做。
  • 谢谢。哪个更容易使用,有没有我可以使用的文档?
  • 不客气。 org.json 可在 Android 中访问,无需任何外部依赖。杰克逊是我个人最喜欢的简单性和性能,但它有点主观。所有框架都有很好的文档记录。
  • 我也想知道为什么 Toast 没有执行?
  • @SiKn8 乍一看可能是因为在调用Toast 之前抛出了Exception。由于您的 catch 语句什么都不做,结果将是 finally 语句中发生的任何事情。

标签: java android json android-fragments


【解决方案1】:

您要做的是使用 Android 的 JSONObject 和 JSONArray 来访问您的 json 数据。

例如,由于您的根是一个 json 数组,您希望从您拥有的 json 数据中实例化一个 JSONArray 对象。

JSONArray jsonArray = new JSONArray(jsonString);

现在,您可以从这个数组中为数组中的每个对象获取单独的 JSONObject。

JSONObject objectOne = new JSONObject(0); // Grabs your first item

您现在可以从 JSONObject 访问您的三个值。

String type = objectOne.get("type") // Will give you the value for type

JSONArray:http://developer.android.com/reference/org/json/JSONArray.html

JSONObject:http://developer.android.com/reference/org/json/JSONObject.html

另一种方法是使用一个框架,让您将 json 反序列化为 Java POJO(普通旧 Java 对象)。 Gson 是最容易使用的。

基本的想法是你创建一个与你的 json 对象直接相关的对象,在你拥有这个之后,你可以轻松地将你的数据存储在 java 对象中,并以你喜欢的方式使用它。

GSON 示例:

Gson gson = new Gson();
MyCustomClass obj2 = gson.fromJson(json, MyCustomClass.class);

MyCustomClass 将包含变量 id、type 和 data。

GSON 参考:https://sites.google.com/site/gson/gson-user-guide

祝你好运!

【讨论】:

  • jsonString 是我班级中的哪个变量?
  • 这将是您从网络调用返回的结果。此外,所有网络都需要在单独的线程而不是 UI 线程上完成。我建议使用 Androids AsyncTask 在新线程上运行您的网络调用。 developer.android.com/reference/android/os/AsyncTask.html
  • 我能够接收到 json 文本,现在可以提取它。我想我可以把它放在一个公共数组中,活动中的任何片段都可以访问它。
  • 是的,这将是一种方法,如果您希望对此进行扩展并可能保留数据,您可能希望在收到数据后将数据存储在手机上的数据库中.这样,无论您在应用程序中的哪个位置,都可以进行查询以检索数据。但就像我说的那样,这可能超出了您的应用程序所需要的。
  • 如果某些条目是 NO DATA,我可以用数据填充它吗?
猜你喜欢
  • 2019-08-13
  • 2019-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 2019-03-06
  • 1970-01-01
  • 2019-06-27
相关资源
最近更新 更多