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

Swift 5中将数组字符串转换为数组时返回nil的问题求助

Swift 5中解析非标准JSON字符串为数组的解决方案

问题原因分析

  1. 原始字符串不符合JSON规范:标准JSON要求所有键名必须用双引号包裹,你的字符串中id、name是裸写的,导致JSONSerialization无法正常解析。
  2. 类型转换错误:目标是解析为数组,但你尝试将结果转为[String: AnyObject](字典类型),类型不匹配导致返回nil。
  3. 强制解包风险:代码中使用data!强制解包,若字符串转Data失败会直接崩溃,属于不安全操作。

解决方案

步骤1:修正字符串为标准JSON格式

如果无法从源头获取符合规范的JSON,可通过正则表达式给键名添加双引号:

let content = "[{id: \"10884\", name: \"Henry\"}, {id: \"85474\", name: \"Jack\"}]"
// 给id、name添加双引号,转为标准JSON字符串
let correctedContent = content.replacingOccurrences(of: "(id|name):", with: "\"$1\":", options: .regularExpression)

步骤2:安全解析为数组

方式1:使用JSONSerialization

if let data = correctedContent.data(using: .utf8),
   // 解析为字典组成的数组,类型为[[String: Any]]
   let usersArray = try? JSONSerialization.jsonObject(with: data) as? [[String: Any]] {
    print(usersArray)
    // 输出:[{id: "10884", name: "Henry"}, {id: "85474", name: "Jack"}]
}

方式2:使用Codable(更推荐的Swift风格)

先定义对应的数据模型:

struct User: Codable {
    let id: String
    let name: String
}

然后进行解析:

do {
    guard let data = correctedContent.data(using: .utf8) else {
        print("字符串转Data失败")
        return
    }
    let users = try JSONDecoder().decode([User].self, from: data)
    print(users)
    // 输出:[User(id: "10884", name: "Henry"), User(id: "85474", name: "Jack")]
} catch {
    print("解析错误:\(error.localizedDescription)")
}

关键注意事项

  • 尽量从数据源获取标准JSON格式数据,避免手动修正字符串的额外操作。
  • 永远避免强制解包(!),优先使用可选绑定(if let/guard let)处理可选值,提升代码稳定性。

内容的提问来源于stack exchange,提问作者a programer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 15:45:30