将JSON解析为Struct Swift 4

时间:2018-08-03 17:41:44

标签: json parsing swift4

我正在尝试将JSON解析为结构。既然那是我看到人们这样做的方式?数据是我刚从URLRequest获得的数据对象。

以下是JSON的示例:

{
  "policies": [{
    "id": 100,
    "name": "00 Kickoff"
  }, {
    "id": 237,
    "name": "02 Install Program 01"
  }, {
    "id": 13,
    "name": "03 AV Install"
  }, {
    "id": 114,
    "name": "04 - Tag Device"
  }, {
    "id": 102,
    "name": "05 VPN Install"
  }]
}

还有更多的项目,但这是JSON的确切结构。

所以我写了一些Structs认为可以保存数据:

struct Policies: Codable {
    let policies: [Policy]

    private enum CodingKeys: String, CodingKey {
        case policies = "policies"
    }
}

struct Policy: Codable {
    let id: String?
    let name: String?

    private enum CodingKeys: String, CodingKey {
        case id = "id"
        case name = "name"
    }
}

然后我尝试进行解码:

do {
    let jssPolicies: Policies = try decoder.decode(Policies.self, from: data)
} catch let error as NSError {
    debugPrint("Error: \(error.description)")
    }

但是然后我得到了错误:

"Error: Error Domain=NSCocoaErrorDomain Code=4864 \"Expected to decode Array<Any> but found a dictionary instead.\" UserInfo={NSCodingPath=(\n), NSDebugDescription=Expected to decode Array<Any> but found a dictionary instead.}"

我感觉自己接近了吗?但是谁知道我可能不是。有人可以提供如何从URL请求中获取此Data对象并将其转换为JSON的任何帮助都会有所帮助。我看了几篇文章,但是由于JSON的结构不同,所以我有点受阻。

预先感谢, 埃德

1 个答案:

答案 0 :(得分:0)

实际上,使用给定的JSON,您应该得到

  

类型'String'不匹配:预期会解码String,但找到一个数字。

因为键id的值是Int。这是真正的JSON吗?

如果您尝试解码[Policies].self

,则会得到描述的错误

如果属性名称与您匹配,您可以省略所有CodingKeys,您可以免费获得它们

struct Policies: Codable {
    let policies: [Policy]
}

struct Policy: Codable {
    let id: Int
    let name: String
}