如何使用 Swift 解码嵌套的 Json?

How to decode nested Json with Swift?

提问人:Stee Ve 提问时间:11/24/2022 更新时间:11/24/2022 访问量:145

问:

我一直在尝试解码这个 Json 数据,但我无法完全做到这一点: 这是我的示例json数据:

{
  "id": 10644,
  "name": "CP2500",
  "numberOfConnectors": 2,
  "connectors": [
    {
      "id": 59985,
      "name": "CP2500 - 1",
      "maxchspeed": 22.08,
      "connector": 1,
      "description": "AVAILABLE"
    },
    {
      "id": 59986,
      "name": "CP2500 - 2",
      "maxchspeed": 22.08,
      "connector": 2,
      "description": "AVAILABLE"
    }
  ]
}

这是我的结构: `

struct Root: Codable {
    var id: Int
    var name: String
    var numberOfConnectors: Int
    var connectors: [Connector]
}


struct Connector: Codable {
    var id: Int
    var name: String
    var maxchspeed: Double
    var connector: Int
    var connectorDescription: String

    enum CodingKeys: String, CodingKey {
        case id, name, maxchspeed, connector
        case connectorDescription = "description"
    }
}

我想解析 [Connector] 数组中的元素,但我只是得到了 Root 级别的元素:

let jsonData = array.data(using: .utf8)!
let root = try JSONDecoder().decode(Root.self, from: jsonData)
print("\(root.id)")

知道该怎么做吗?

JSON Swift 解析 嵌套 JSONDecoder

评论

0赞 burnsi 11/24/2022
尝试打印并查看它是否真的包含任何子项。arrayConnector
1赞 Leo Dabus 11/24/2022
let connectors = try JSONDecoder().decode(Root.self, from: jsonData).connectors
0赞 Joakim Danielson 11/24/2022
你的问题到底是什么,对我来说它看起来不像是解码问题,所以这是否如上所述,只是如何访问数组属性?
0赞 Stee Ve 11/24/2022
我的问题,如果我无法打印var“connectorDescription”。例如,我不能不打印(“(root.connectors.connectorDescription)“)。
1赞 Larme 11/24/2022
root.connectors.connectorDescription确实行不通,因为它没有意义。 是 的 数组,因此它没有属性。只有该数组的元素才具有该属性。您需要遍历该数组的元素。root.connectorsConnectorconnectorDescriptionConnector

答:

0赞 Stee Ve 11/24/2022 #1
do {
    let root = try JSONDecoder().decode(Root.self, from: jsonData)
    print("root id : \(root.id)")
    root.connectors.forEach {
        print("name : \($0.name),"," connector id : \($0.id),","status : \($0.description)");
    }
    
} catch {
    print(error.localizedDescription)
}

评论

1赞 Larme 11/24/2022
旁注:避免使用 for ,尤其是在 上,因为它可能会跳过有关调试的重要信息。更喜欢使用。您可以简单地通过替换为 来查看,您将看到有关实际错误的有用信息。print(error.localizedDescription)tryJSONDecoderprint(error)var id: Intvar id: String