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

Swift将JSON字符串解析为Dictionary的技术问题咨询

解决Swift中解析双重转义JSON字符串的问题

你遇到的核心问题是:从plist读取的JSON字符串被双重转义了——它本质上是一个"包含JSON的字符串",而非直接的JSON数据。直接用JSONSerialization解析的话,只会得到一个字符串对象,而不是你想要的字典。

问题根源分析

你提到的字符串显示为:

"\"{runid:\\\"8488\\\",testids:[\"7480769\"]}\""

拆解一下:

  • 最外层的""是字符串本身的包裹
  • 内部的\\\"是被双重转义的双引号,实际对应的是JSON里的"
  • 整个内容其实是把一个合法的JSON对象,当成字符串值存储在了plist里

解决方案:先清理转义,再解析

我们需要先把这个被转义的字符串还原成标准的JSON格式,再进行解析:

  1. 去除外层引号:用trimmingCharacters去掉首尾的双引号
  2. 修正内部转义:把\\\"替换成\",让JSON格式恢复正常
  3. 安全解析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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:11:58