Swift 5中将数组字符串转换为数组时返回nil的问题求助
Swift 5中解析非标准JSON字符串为数组的解决方案
问题原因分析
- 原始字符串不符合JSON规范:标准JSON要求所有键名必须用双引号包裹,你的字符串中
id、name是裸写的,导致JSONSerialization无法正常解析。 - 类型转换错误:目标是解析为数组,但你尝试将结果转为
[String: AnyObject](字典类型),类型不匹配导致返回nil。 - 强制解包风险:代码中使用
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
相关产品推荐
相关产品推荐

