采用以下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!)
但是这样做感觉不对,只是因为数组嵌套在字典中而创建一个新的模型对象。
答案 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)
}