将 JSON 解析为 ListView 友好的输出

Posted

技术标签:

【中文标题】将 JSON 解析为 ListView 友好的输出【英文标题】:Parse JSON into a ListView friendly output 【发布时间】:2010-12-31 06:16:18 【问题描述】:

所以我有这个 JSON,然后我的活动将其检索到一个字符串:

    "popular":
        "authors_last_month": [
         
            "url":"http://activeden.net/user/OXYLUS",
            "item":"OXYLUS",
            "sales":"1148",
            "image":"http://s3.envato.com/files/15599.jpg"
         ,
         
            "url":"http://activeden.net/user/digitalscience",
            "item":"digitalscience",
            "sales":"681",
            "image":"http://s3.envato.com/files/232005.jpg"
         
         
            ...
         
        ],
        "items_last_week": [
         
            "cost":"4.00",
            "thumbnail":"http://s3.envato.com/files/227943.jpg",
            "url":"http://activeden.net/item/christmas-decoration-balls/75682",
            "sales":"43",
            "item":"Christmas Decoration Balls",
            "rating":"3",
            "id":"75682"
         ,
         
            "cost":"30.00",
            "thumbnail":"http://s3.envato.com/files/226221.jpg",
            "url":"http://activeden.net/item/xml-flip-book-as3/63869",
            "sales":"27",
            "item":"XML Flip Book / AS3",
            "rating":"5",
            "id":"63869"
         ,
         
            ...
         ],
        "items_last_three_months": [
         
            "cost":"5.00",
            "thumbnail":"http://s3.envato.com/files/195638.jpg",
            "url":"http://activeden.net/item/image-logo-shiner-effect/55085",
            "sales":"641",
            "item":"image logo shiner effect",
            "rating":"5",
            "id":"55085"
         ,
         
            "cost":"15.00",
            "thumbnail":"http://s3.envato.com/files/180749.png",
            "url":"http://activeden.net/item/banner-rotator-with-auto-delay-time/22243",
            "sales":"533",
            "item":"BANNER ROTATOR with Auto Delay Time",
            "rating":"5",
            "id":"22243",
         
            ...
         ]
    

它也可以访问here,虽然它因为它是一个相当长的字符串,我已经将上面的内容修剪下来以显示需要的内容。

基本上,我希望能够从“items_last_week”访问项目并创建它们的列表 - 最初我的计划是让“缩略图”在左侧,旁边有“项目”,但从播放今天使用 SDK 似乎太难或不可能实现这一点,所以我很乐意在列表中包含来自“items_last_week”的“item”数据。

来自 php 我正在努力使用 Java 可用的任何 JSON 库,因为它似乎不仅仅是我需要反序列化的一行代码(我认为这是正确的词) JSON,它们似乎都需要某种形式的附加类,除了我拥有的 JSONArray/JSONObject 脚本,它不喜欢 items_last_week 嵌套的事实(再次,我认为这是 JSON 术语)并且需要很长时间在 android 模拟器上运行。

因此,实际上,我需要一种(最好是简单的)方法将 items_last_week 数据传递给 ListView。我知道我需要一个自定义适配器,我可能可以理解但我无法理解,无论我花了多少时间试图弄清楚如何访问 JSON 字符串的某些部分..

【问题讨论】:

您需要 Json 帮助吗?然后你可以在你的问题中添加 Json 标签。 一个“java”标签也是合适的。 【参考方案1】:

最初我的计划是 左侧的“缩略图”与 'item' 在它旁边,但从播放 今天出现在 SDK 周围 太难或不可能实现 这个

这远非不可能,但要做到正确会很乏味,除非您为自己使用something that already wraps up that pattern(希望这是合理的“正确”)。在 Web 上,性能/带宽问题是用户的问题 - 在移动设备中,它们是您的问题。

因为它似乎不仅仅是一个 我需要的代码行 反序列化(我认为这是正确的 字)JSON

new JSONObject(data) 是一行代码。现在,获取 JSON(我假设您正在从上述 URL 执行)将是几行代码。无论是解析 JSON 还是从 Internet 获取它都不是 Android 独有的——所有这些在桌面 Java 应用程序、Java servlet 或其他任何东西上看起来都是一样的。

除了 JSONArray/JSONObject 我有不喜欢的脚本 items_last_week 是嵌套的事实

我没有遇到像您的文件展示这样的结构解析 JSON 的问题。此外,这并不是 Android 独有的——JSON 解析器用于许多其他基于 Java 的项目。

并且需要很长时间才能运行 安卓模拟器

模拟器的速度与您的开发机器的速度有关。对我来说,模拟器通常比实际的手机硬件慢……而且我的桌面是四核的。请记住,模拟器假装是在您的 PC 上运行的 ARM 芯片组,将 ARM 操作码即时转换为 x86 操作码,因此它不会很快并且不能很好地利用多个内核。

所以,实际上,我需要一个(最好是 简单)的方式来通过 items_last_week 数据到 ListView。

Android 中并没有真正内置任何东西来获取任意 JSON 结构和任意数据,并将其直接倒入ListView。这不是 JSON 独有的——XML 也会出现类似的现象。

您的选择是:

    创建一个自定义 ListAdapter 来包装已解析的 JSON。 将解析后的 JSON 转换为 MatrixCursor(想想二维数据数组)并使用 SimpleCursorAdapter。 将解析后的 JSON 转换为 ArrayList<String> 并使用 ArrayAdapter

就短期而言,选项#3 可能是最简单的。

我知道我需要定制 我可能会得到我的适配器 转过头来,但我无法理解, 不管我有多少时间 只是想弄清楚, 如何访问 JSON 的某些部分 字符串..

这个问题太模糊了,无法提供帮助。您可能会考虑打开一个单独的问题,标记为 Java 和 JSON,您可以在其中详细了解 json.org 解析器的问题。

【讨论】:

非常好地分解了 OP 的问题。简明扼要的部分答案/分析。

以上是关于将 JSON 解析为 ListView 友好的输出的主要内容,如果未能解决你的问题,请参考以下文章

如何将 JSON 字符串解析为 ListView?

将 JSON 数据解析为 ListView

如何将资产文件夹中的本地 JSON 文件解析为 ListView?

如何使用json解析android在listview中获取图像

解析 JSON - JSONException:整数无法转换为 JSONObject

Android 怎样将一组json数据的key value对应的放入到listview中显示两列