在swift 4中解码嵌套数组

时间:2017-10-10 15:17:19

标签: swift swift4

采用以下JSON:

let rawJson =
"""
[
      {
          "id": 1,
          "name":"John Doe"
      },
      {
          "id": 2,
          "name":"Luke Smith"
      },
 ]
"""

User型号:

struct User: Decodable {
    var id: Int
    var name: String
}

解码非常简单,如下:

let data = rawJson.data(using: .utf8)
let decoder = JSONDecoder()
let users = try! decoder.decode([User].self, from: data!)

但是,如果JSON看起来像这样,顶级是一个字典,需要获取users的数组:

let json =
"""
{
    "users":
    [
        {
          "id": 1,
          "name":"John Doe"
        },
        {
          "id": 2,
          "name":"Luke Smith"
        },
    ]
}
"""

阅读JSON最有效的解决方案是什么?我当然可以像这样创建另一个struct

struct SomeStruct: Decodable {
    var posts: [Post]
}

并像这样解码:

let users = try! decoder.decode(SomeStruct.self, from: data!)

但是这样做感觉不对,只是因为数组嵌套在字典中而创建一个新的模型对象。

1 个答案:

答案 0 :(得分:4)

如果你想利用JSONDecoder,你必须创建一个嵌套结构(<)。

我建议使用名称Root作为根对象,并将子结构放入Root

struct Root : Decodable {

    struct User : Decodable {
        let id: Int
        let name: String
    }

    let users : [User]
}

let json = """
{
    "users": [{"id": 1, "name":"John Doe"},
              {"id": 2, "name":"Luke Smith"}]
}
"""

let data = Data(json.utf8)
do {
    let root = try JSONDecoder().decode(Root.self, from: data)
    print(root.users)
} catch {
    print(error)
}