迭代JSON数组对象

4
我正在查询并获取一个 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}}......

如何正确遍历content的值并找到isDefault的值?在示例JSON中,没有一个content的isDefault = true,因此它将默认为第一个对象。
似乎我只能将值作为字符串进行操作,我必须将content强制转换为JSONArray吗?
编辑:我似乎无法将mediaObject.content转换为JSONArray。 mediaObject.optJSONArray(“content”)返回null。我还尝试将其作为字符串获取,然后将其转换为JSONArray,但是没有成功。
编辑2:找到了数据问题所在,当我用gson解析json时,它会干扰最终输出的数据。
因此,我从new Gson().toJson(jsonObject);更改为jsonObject.toString()),现在我可以使用optJSONArray来定位数组。要将数据放回JSONObject中,我使用了JSONObject mediaObject = new JSONObject(mediaString);
GSON正在更改数据。

尝试将content转换为字符串并记录日志时,出现了问题,显示的是格式不正确的JSON。输出如上所示,随机键值(例如value=)似乎会影响系统?我甚至无法定位values,因为它是一个错误的JSON字符串。 - Bankzilla
你有考虑过使用正则表达式吗? - Jordan
正则表达式并没有什么帮助,幸运的是我能够通过下面两个答案解决它。GSON在创建JSON字符串时修改了数据,所以我完全放弃了它。 - Bankzilla
2个回答

3

你可以获取一个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方法和JSONArray方法的链接:

这里是所有JSONObject方法JSONArray方法的链接。


我之前尝试过这个,但是出现了错误 Unhandled exception: org.json.JSONException。有没有一种方法可以在不存在时不抛出 null?在这种情况下,content 始终 存在。 - Bankzilla
你需要检查 if(jsonObj.has("key_like_isDefault")),然后尝试提取你所需的值。 - Mithun
你的意思是不会抛出null还是不会抛出异常?如果是后者,你可以使用mediaObject.optJSONArray("content") - Enrico
有趣的是,循环抛出了“尝试在空对象引用上调用虚拟方法'int org.json.JSONArray.length()'”的异常。 - Bankzilla
虽然这部分是正确的,但它没有运行的原因是由于gson进行了转换。它改变了问题中显示的json字符串。所以当我试图将其转换回一个JSONObject时,它就没有按照预期工作。 - Bankzilla

2
你能不能不要只是

这样

呢?
JSONObject mJson = new JSONObject(inputString);

为什么要使用Gson?


没有关于json生成的问题,只是针对其中的数据出现了错误。我无法定位数组,它返回null。 - Bankzilla

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接