Swift中使用TabularData框架处理含数组值的JSON数据问题
Swift TabularData处理JSON数组:去除Optional包装并重命名列
问题场景
使用TabularData读取含数组值的JSON后,数组元素带Optional包装,列名为原JSON字段名,需要将列名改为fnam、lnam,同时让数组显示为["元素"]格式。
JSON示例
[ { "firstname":["John", "john2"], "surname": ["Doe", "doe2"] }, { "firstname":["Jane", "Jane2"], "surname": ["Doe", "Doe2"] } ]
解决方案代码
guard let fileUrl = Bundle.main.url(forResource: "jsondatafile", withExtension: "json") else { return } do { var dataframe = try DataFrame(contentsOfJSONFile: fileUrl) // 处理firstname列:解包数组可选元素,重命名为fnam if let firstnameCol = dataframe["firstname"] as? Column<[String?]> { let unwrappedFnam = firstnameCol.map { $0.compactMap { $0 } } dataframe.replaceColumn("firstname", with: Column(name: "fnam", contents: unwrappedFnam)) } // 处理surname列:解包数组可选元素,重命名为lnam if let surnameCol = dataframe["surname"] as? Column<[String?]> { let unwrappedLnam = surnameCol.map { $0.compactMap { $0 } } dataframe.replaceColumn("surname", with: Column(name: "lnam", contents: unwrappedLnam)) } print(dataframe) } catch { print("处理失败:\(error)") }
代码说明
- 移除Optional包装:用
compactMap遍历数组元素,自动解包并过滤可能存在的nil值(兼容JSON中存在缺失值的情况) - 重命名列:通过
replaceColumn方法替换原列,同时指定新列名fnam/lnam - 错误处理:替换
try!为do-catch,避免因文件读取失败导致运行时崩溃
最终输出
┏━━━┳━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┓ ┃ ┃ fnam ┃ lnam ┃ ┃ ┃ <Array<String>> ┃ <Array<String>> ┃ ┡━━━╇━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━┩ │ 0 │ ["John", "john2"] │ ["Doe", "doe2"] │ │ 1 │ ["Jane", "Jane2"] │ ["Doe", "Doe2"] │ └───┴───────────────────┴─────────────────┘
内容的提问来源于stack exchange,提问作者Satish
相关产品推荐
相关产品推荐

