Swift将JSON字符串解析为Dictionary的技术问题咨询
解决Swift中解析双重转义JSON字符串的问题
你遇到的核心问题是:从plist读取的JSON字符串被双重转义了——它本质上是一个"包含JSON的字符串",而非直接的JSON数据。直接用JSONSerialization解析的话,只会得到一个字符串对象,而不是你想要的字典。
问题根源分析
你提到的字符串显示为:
"\"{runid:\\\"8488\\\",testids:[\"7480769\"]}\""
拆解一下:
- 最外层的
""是字符串本身的包裹 - 内部的
\\\"是被双重转义的双引号,实际对应的是JSON里的" - 整个内容其实是把一个合法的JSON对象,当成字符串值存储在了plist里
解决方案:先清理转义,再解析
我们需要先把这个被转义的字符串还原成标准的JSON格式,再进行解析:
- 去除外层引号:用
trimmingCharacters去掉首尾的双引号 - 修正内部转义:把
\\\"替换成\",让JSON格式恢复正常 - 安全解析JSON:用do-catch替代
try!,避免崩溃
完整代码示例:
// 假设theString是你从plist获取到的转义字符串 let rawString = theString.trimmingCharacters(in: .quotationMarks) let cleanedJSONString = rawString.replacingOccurrences(of: "\\\"", with: "\"") // 转换为Data并解析 guard let jsonData = cleanedJSONString.data(using: .utf8) else { print("Failed to convert string to data") return } do { if let jsonDict = try JSONSerialization.jsonObject(with: jsonData, options: []) as? [String: Any] { // 成功解析为字典,现在可以正常访问键值 print("Parsed Dictionary: \(jsonDict)") if let runId = jsonDict["runid"] as? String { print("Run ID: \(runId)") } if let testIds = jsonDict["testids"] as? [String] { print("Test IDs: \(testIds)") } } else { print("Parsed JSON is not a dictionary") } } catch { print("JSON parsing error: \(error.localizedDescription)") }
为什么原来的代码不行?
你之前的代码直接把转义后的字符串转成Data,JSONSerialization会把它识别为一个单个字符串值(而不是JSON对象)。即便用了.allowFragments,得到的也只是这个原始的转义字符串,而不是解析后的字典。必须先清理掉额外的转义层,才能让JSON解析器正确识别内部的对象结构。
内容的提问来源于stack exchange,提问作者Harsh
相关产品推荐
相关产品推荐

