在 tableView 中填充多个部分和行的 JSON 响应

标签 json swift

我有以下 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/

相关文章:

ios - 在 swift 3 中,你如何推进索引?

swift - 我还如何为泛型类指定泛型集合类型?

Swift - 如何检查 Sprite 是否已分配给特定图像

javascript - 为什么 Google 在前面加上 while(1);到他们的 JSON 响应?

c# - 如何在 C# 中将自定义异常序列化为 json

json - 使用 map 和列表列将非规范化表导出到cassandra表

jQuery - 如何消除跨域限制

ios - 允许登录类在全局拥有一个共享实例

JSON 提供者 jackson 使用 boolean 类型序列化和反序列化的问题

xcode - Swift 中的 double 范围