【问题标题】:parsing nested JSON statement with arrays in Swift 4在 Swift 4 中使用数组解析嵌套的 JSON 语句
【发布时间】:2019-01-23 22:21:59
【问题描述】:

我环顾四周,但找不到解决我问题的答案。我是编码新手,并使用此示例进入主题。 我想解析一个嵌套的 JSON 语句,我用来测试的代码如下:

import Foundation

let jsonDict = """
{"Data":[{"id": 40, "val": 600,"valStr": "600","sysVal": "580","inst": 0,"valid": "true"},
{"id": 44, "val": 600,"valStr": "600","sysVal": "580","inst": 0,"valid": "true"}]}
""".data(using: .utf8)!
print("IF statement ")


let json = try? JSONSerialization.jsonObject(with: jsonDict, options: .allowFragments) as! [String: Any]
if let dictionary = json as? [String: Any],
    let data = dictionary["Data"]
{
    print("Data= \(data)")
}

我可以访问根元素的全部内容,但不能访问数组中的元素。我很乐意在这里提供任何帮助。

【问题讨论】:

  • 您的data 变量是一个字典数组。从那里去。迭代数组和从字典中访问值的例子不胜枚举。请说明您在访问数组元素时遇到了什么问题。
  • 顺便说一句 - 将 as! 更改为 as?

标签: arrays json swift


【解决方案1】:

删除JSONSerialization 并使用Decodable。它更具描述性和效率。

result 是代表外部字典的Root 结构。字典键成为结构成员。

let jsonString = """
{"Data":[{"id": 40, "val": 600,"valStr": "600","sysVal": "580","inst": 0,"valid": "true"},
{"id": 44, "val": 600,"valStr": "600","sysVal": "580","inst": 0,"valid": "true"}]}
"""

let data = Data(jsonString.utf8)

struct Root : Decodable {
    private enum CodingKeys : String, CodingKey { case data = "Data"}

    let data : [Subject]
}

struct Subject : Decodable {
    let id, val, inst : Int
    let valStr, sysVal, valid : String
}

do {
    let result = try JSONDecoder().decode(Root.self, from: data)
    for item in result.data {
        print(item.id, item.val, item.valid)
    }
} catch { print(error) }

【讨论】:

  • 亲爱的 Vadian,亲爱的 rmaddy 非常感谢您的帮助。它有效,让我更接近我的解决方案!我想我还有很长的路要走,再次感谢。罗伯特
猜你喜欢
  • 2018-08-06
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多