我有以下 JSON 响应:
{
"IT":[
{
"REPORT_NAME_EN":"Maecenas Eu Arcu",
"REPORT_DESCRIPTION_EN":"Numquam optio, doloribus, adipisci recusandae enim."
}
],
"Marketing":[
{
"REPORT_NAME_EN":"Brain Capacity",
"REPORT_DESCRIPTION_EN":"Lorem ipsum dolor sit amet, consectetur adipisicing elit."
},
{
"REPORT_NAME_EN":"Lorem Ipsum Dolor",
"REPORT_DESCRIPTION_EN":"Vitae harum atque possimus distinctio dolores nostrum optio."
}
],
"Network":[
{
"REPORT_NAME_EN":"Quisque Interdum",
"REPORT_DESCRIPTION_EN":"Quod, natus, nihil. Repellat dolore, doloremque laborum exercitationem consectetur."
}
]
}
我希望它在具有多个部分(和行)的 TableView 中显示如下:
Section 0: "IT"
Row 0: "REPORT_NAME_EN" & "REPORT_DESCRIPTION_EN"
Section 1: "Marketing"
Row 0: "REPORT_NAME_EN" & "REPORT_DESCRIPTION_EN"
Row 1: "REPORT_NAME_EN" & "REPORT_DESCRIPTION_EN"
Section 2: "Network"
Row 0: "REPORT_NAME_EN" & "REPORT_DESCRIPTION_EN"
我通常将我的 JSON 结果附加到 NSArray,但这是我第一次使用和接收多维 JSON,我在附加时遇到了问题:
var arrJSON = [[String:Any]]()
do {
if let data = data,
let json = try JSONSerialization.jsonObject(with: data) as? [String: Any]{
self.arrJSON = [json] as [[String:Any]]
}
}
当我执行 arrJSON.count 时,它给我的结果是 1,但它应该是 3。
我是否最好带上两个 JSON 响应(一个用于填充我的部分,另一个用于我的行)?
最佳答案
强烈建议不要使用“原始”集合类型,而是为报告和部分使用自定义结构。
JSON 用Decodable
解码并映射到Section
的数组
struct Section {
let name : String
let reports : [Report]
}
struct Report : Decodable {
let name : String
let description : String
private enum CodingKeys : String, CodingKey {
case name = "REPORT_NAME_EN"
case description = "REPORT_DESCRIPTION_EN"
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
name = try container.decode(String.self, forKey: .name)
description = try container.decode(String.self, forKey: .description)
}
}
let jsonString = """
{
"IT": [{"REPORT_NAME_EN":"Maecenas Eu Arcu",
"REPORT_DESCRIPTION_EN":"Numquam optio, doloribus, adipisci recusandae enim."}],
"Marketing": [{"REPORT_NAME_EN":"Brain Capacity",
"REPORT_DESCRIPTION_EN":"Lorem ipsum dolor sit amet, consectetur adipisicing elit."},
{"REPORT_NAME_EN":"Lorem Ipsum Dolor",
"REPORT_DESCRIPTION_EN":"Vitae harum atque possimus distinctio dolores nostrum optio."}],
"Network": [{"REPORT_NAME_EN":"Quisque Interdum",
"REPORT_DESCRIPTION_EN":"Quod, natus, nihil. Repellat dolore, doloremque laborum exercitationem consectetur."}]}
"""
do {
let data = Data(jsonString.utf8)
let result = try JSONDecoder().decode([String:[Report]].self, from: data)
let sections = result.map{ (key, value) -> Section in
Section(name:key, reports:value)
}
print(sections)
} catch {
print("error: ", error)
}
声明数据源数组
var sections = [Section]()
在 numberOfSections
中返回
sections.count
在 numberOfRowsInSection
中返回
sections[section].reports.count
在cellforRow
中得到一个报告
let section = sections[indexPath.section]
let report = section.reports[indexPath.row]
在 titleForHeaderInSection
中返回
sections[section].name
关于在 tableView 中填充多个部分和行的 JSON 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48595731/