You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 20:43:13