解析嵌套 JSON SWIFT 4
Parsing Nested JSON SWIFT 4
谁能告诉我我做错了什么?
这是 JSON 我正在尝试解析:
{
"results": {
"AF": {
"alpha3": "AFG",
"currencyId": "AFN",
"currencyName": "Afghan afghani",
"currencySymbol": "؋",
"id": "AF",
"name": "Afghanistan"
},
"AI": {
"alpha3": "AIA",
"currencyId": "XCD",
"currencyName": "East Caribbean dollar",
"currencySymbol": "$",
"id": "AI",
"name": "Anguilla"
}
}
}
我的代码:
class Results: Codable {
let results: [Country]
init(results: [Country]) {
self.results = results
}
}
class Country: Codable {
let currencyId: String
let currencyName: String
let currencySymbol: String
let id: String
let name: String
init(currencyId :String, currencyName: String, currencySymbol: String, id: String, name: String ) {
self.currencyId = currencyId
self.currencyName = currencyName
self.currencySymbol = currencySymbol
self.id = id
self.name = name
}
}
我看过 Apple 关于解码嵌套结构的文档,但我仍然不明白如何正确处理 JSON 的不同级别。
谢谢。
检查键 "results"
的概述值。
"results": {
...
}
{...}
代表JSON对象。 Swift struct
(或 class
,如果您认为更好)在某些情况下适用于 JSON 对象。
在其他情况下,Swift Dictionary
可能更合适。
并且此 JSON 对象的每个值都采用以下形式:
{
"alpha3": ...,
"currencyId": ...,
"currencyName": ...,
"currencySymbol": ...,
"id": ...,
"name": ...
}
与您的 Country
.
匹配
因此,您只需要在 Results
class.
中更改 results
的类型
class Results: Codable {
let results: [String: Country]
init(results: [String: Country]) {
self.results = results
}
}
属性 和它的 class 具有相同的名称(不区分大小写)可能会在将来引起一些混淆,但我现在保持原样。
你可以这样测试:
(假设在 Playground 中使用修改后的 Results
和您的 Country
进行测试。)
let jsonText = """
{
"results": {
"AF": {
"alpha3": "AFG",
"currencyId": "AFN",
"currencyName": "Afghan afghani",
"currencySymbol": "؋",
"id": "AF",
"name": "Afghanistan"
},
"AI": {
"alpha3": "AIA",
"currencyId": "XCD",
"currencyName": "East Caribbean dollar",
"currencySymbol": "$",
"id": "AI",
"name": "Anguilla"
}
}
}
"""
let jsonData = jsonText.data(using: .utf8)!
let decoder = JSONDecoder()
do {
let results = try decoder.decode(Results.self, from: jsonData)
print(results) //-> __lldb_expr_1.Results
} catch {
print(error)
}
谁能告诉我我做错了什么?
这是 JSON 我正在尝试解析:
{
"results": {
"AF": {
"alpha3": "AFG",
"currencyId": "AFN",
"currencyName": "Afghan afghani",
"currencySymbol": "؋",
"id": "AF",
"name": "Afghanistan"
},
"AI": {
"alpha3": "AIA",
"currencyId": "XCD",
"currencyName": "East Caribbean dollar",
"currencySymbol": "$",
"id": "AI",
"name": "Anguilla"
}
}
}
我的代码:
class Results: Codable {
let results: [Country]
init(results: [Country]) {
self.results = results
}
}
class Country: Codable {
let currencyId: String
let currencyName: String
let currencySymbol: String
let id: String
let name: String
init(currencyId :String, currencyName: String, currencySymbol: String, id: String, name: String ) {
self.currencyId = currencyId
self.currencyName = currencyName
self.currencySymbol = currencySymbol
self.id = id
self.name = name
}
}
我看过 Apple 关于解码嵌套结构的文档,但我仍然不明白如何正确处理 JSON 的不同级别。
谢谢。
检查键 "results"
的概述值。
"results": {
...
}
{...}
代表JSON对象。 Swift struct
(或 class
,如果您认为更好)在某些情况下适用于 JSON 对象。
在其他情况下,Swift Dictionary
可能更合适。
并且此 JSON 对象的每个值都采用以下形式:
{
"alpha3": ...,
"currencyId": ...,
"currencyName": ...,
"currencySymbol": ...,
"id": ...,
"name": ...
}
与您的 Country
.
因此,您只需要在 Results
class.
results
的类型
class Results: Codable {
let results: [String: Country]
init(results: [String: Country]) {
self.results = results
}
}
属性 和它的 class 具有相同的名称(不区分大小写)可能会在将来引起一些混淆,但我现在保持原样。
你可以这样测试:
(假设在 Playground 中使用修改后的 Results
和您的 Country
进行测试。)
let jsonText = """
{
"results": {
"AF": {
"alpha3": "AFG",
"currencyId": "AFN",
"currencyName": "Afghan afghani",
"currencySymbol": "؋",
"id": "AF",
"name": "Afghanistan"
},
"AI": {
"alpha3": "AIA",
"currencyId": "XCD",
"currencyName": "East Caribbean dollar",
"currencySymbol": "$",
"id": "AI",
"name": "Anguilla"
}
}
}
"""
let jsonData = jsonText.data(using: .utf8)!
let decoder = JSONDecoder()
do {
let results = try decoder.decode(Results.self, from: jsonData)
print(results) //-> __lldb_expr_1.Results
} catch {
print(error)
}