【问题标题】:Iterate JSON array object迭代 JSON 数组对象
【发布时间】:2015-05-27 22:37:57
【问题描述】:

我正在查询并返回一个 json 字符串,为了这个示例,我将发布一个示例。我试图弄清楚我将如何挖掘值数组并找到标记为默认值的值。

示例 JSON

{
    "id": "333706819617",
    "guid": "4aCdriCG0WvfYEUkFf8_xqQEFxgwgNU8",
    "title": "Test entry",
    "author": "",
    "description": "Desc",
    "added": 1411702963000,
    "content": [
        {
            "audioChannels": 2,
            "audioSampleRate": 44100,
            "bitrate": 281656,
            "checksums": {
                "md5": "70DF3E21131F9F02C3F0A74F3664AB73"
            },
            "contentType": "audio",
            "duration": 43.258,
            "expression": "full",
            "fileSize": 1522986,
            "frameRate": 0.0,
            "format": "AAC",
            "height": 288,
            "isDefault": false,
            "language": "en",
            "sourceTime": 0.0,
            "url": "http://example.com/dZiASoxchRyS",
            "width": 352
        },
        {
            "audioChannels": 2,
            "audioSampleRate": 44100,
            "bitrate": 160000,
            "checksums": {
                "md5": "3AC622D31B9DED37792CC7FF2F086BE6"
            },
            "contentType": "audio",
            "duration": 43.206,
            "expression": "full",
            "fileSize": 866504,
            "frameRate": 0.0,
            "format": "MP3",
            "height": 0,
            "isDefault": false,
            "language": "",
            "sourceTime": 0.0,
            "url": "http://example.com/59M_PSFgGGXE",
            "width": 0
        }
    ],
    "thumbnails": [
        {
            "audioChannels": 0,
            "audioSampleRate": 0,
            "bitrate": 0,
            "checksums": {
                "md5": "BE8C98A07B3FE9020BFA464C42112999"
            },
            "contentType": "image",
            "duration": 0.0,
            "expression": "full",
            "fileSize": 20379,
            "frameRate": 0.0,
            "format": "JPEG",
            "height": 256,
            "isDefault": true,
            "language": "",
            "sourceTime": 0.0,
            "url": "http://img.example.com/waveform.jpg",
            "width": 256
        }
    ]
}

我将 JSON 字符串转换回JSONObject

JSONObject mediaObject = new Gson().fromJson(mediaString, JSONObject.class);
String content = mediaObject.optString("content");

当我输出content 时,它会返回以下内容。

{values=[{nameValuePairs={audioChannels=2.0, audioSampleRate=44100.0, bitrate=281656.0, checksums={nameValuePairs={md5=70DF3E21131F9F02C3F0A74F3664AB73}}......

如何正确遍历内容的值并找到isDefault 的值?在示例 JSON 中,没有 isDefault = true 的内容,因此默认为第一个对象。

似乎我只能将值定位为字符串,我必须将content 转换为JSONArray吗?

编辑:我似乎无法将 mediaObject.content 转换为 JSONArray。 mediaObject.optJSONArray("content") 返回空值。我也试过把它作为一个字符串,然后转换成一个 JSONArray 没有占上风。

编辑 2: 发现数据有什么问题,当我用 gson 解析 json 时,它与最终输出的数据混淆了。

所以我从new Gson().toJson(jsonObject); 更改为jsonObject.toString()),现在我可以使用optJSONArray 来定位数组。为了将它们的数据返回到 JSONObject,我使用了JSONObject mediaObject = new JSONObject(mediaString);

GSON 正在更改数据

【问题讨论】:

  • 在转换为字符串并记录时尝试定位 content 时出现问题,它显示格式错误的 json。输出如上所示,随机键显示为value=,我认为这会干扰系统?我什至无法定位 values,因为它是一个错误的 json 字符串。
  • 你考虑过使用正则表达式吗?
  • 正则表达式不会有太大帮助,幸运的是我能够用下面的两个答案解决它。 GSON 在创建 json 字符串时正在修改数据,所以我将它们全部丢弃。

标签: java android json gson


【解决方案1】:

您可以获取 JSONArray,而不是从 JSONObject 中提取内容的字符串值

JSONArray content = mediaObject.getJSONArray("content");

现在您可以使用非常传统的 for 循环遍历数组中的对象

for(int i = 0; i < content.length(); i++) {
    JSONObject mediaItem = content.getJSONObject(i);
    boolean itemIsDefault = mediaItem.getBoolean("isDefault");
}

这里是所有JSONObject methods 和JSONArray methods 的链接

【讨论】:

  • 我之前试过这个,得到了错误Unhandled exception: org.json.JSONException。如果它不存在,有没有办法不抛出 null ?在这种情况下content总是存在
  • 您需要检查if(jsonObj.has("key_like_isDefault")),然后尝试提取您需要的值
  • 你的意思是不抛出null还是不抛出异常?如果是后者,可以使用mediaObject.optJSONArray("content")
  • 有趣,循环抛出Attempt to invoke virtual method 'int org.json.JSONArray.length()' on a null object reference
  • 虽然这部分正确,但它不起作用的原因是 gson 转换。如问题所示,它正在更改 json 字符串。因此,当我将其转换回 JSONObject 时,它不是在玩球。
【解决方案2】:

你能不只是

JSONObject mJson = new JSONObject(inputString);

你为什么使用 Gson?

【讨论】:

  • json 的生成方式没有问题,这只是针对内部数据的错误。我无法定位数组,它返回 null。
猜你喜欢
  • 1970-01-01
  • 2011-09-12
  • 1970-01-01
  • 2019-08-11
  • 1970-01-01
  • 2021-06-22
  • 1970-01-01
  • 2018-10-19
  • 1970-01-01
相关资源
最近更新 更多