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

Swift中如何获取无Unicode转义序列的JSON响应

解决Swift请求JSON返回Unicode转义序列的问题

你看到的JSON中的Unicode转义序列仅为调试打印时的默认表现,实际存储在Data中的字符串本身是正常的可显示文本,只需修改解析和读取逻辑即可得到正常内容。

常见解决方案

方案1:使用Swift官方推荐的Codable协议解析(优先选择)

这种方式类型安全,解析后直接读取对应字段即可得到正常字符串,代码示例:
首先定义对应数据结构:

// 定义和JSON结构匹配的模型
struct ResponseResult: Codable {
    let id: Int
    let writeDate: String
    let name: String
    let xPhone: String
    // 其余需要的字段按需补充即可
    enum CodingKeys: String, CodingKey {
        case id
        case writeDate = "write_date"
        case name
        case xPhone = "x_phone"
        // 其余字段的映射同理补充
    }
}

struct RootResponse: Codable {
    let result: ResponseResult
}

修改请求回调中的解析逻辑:

session.dataTask(with: request) { data, response, error in
    guard let data = data, error == nil else {
        completion(.failure(.invalidData))
        return
    }
    do {
        let decoder = JSONDecoder()
        // 也可以开启自动蛇形转驼峰,省略CodingKeys的手动编写
        // decoder.keyDecodingStrategy = .convertFromSnakeCase
        let responseData = try decoder.decode(RootResponse.self, from: data)
        // 直接读取字段即可得到无转义的正常文本
        print(responseData.result.name)
        completion(.success(responseData))
    } catch {
        completion(.failure(.decodingProblem))
    }
}.resume()

方案2:使用JSONSerialization时单独读取字段

直接打印JSONSerialization返回的Any类型对象时,系统会自动将非ASCII字符转为Unicode转义序列做调试输出,只需取出对应字段转成String即可得到正常内容:

do {
    guard let jsonDict = try JSONSerialization.jsonObject(with: data) as? [String: Any],
          let result = jsonDict["result"] as? [String: Any],
          let name = result["name"] as? String else {
        completion(.failure(.invalidData))
        return
    }
    // 此时打印的name就是无转义的正常文本
    print(name)
} catch {
    completion(.failure(.decodingProblem))
}

方案3:需要输出完整无转义的JSON字符串

如果你需要将完整JSON转为无转义的字符串保存或输出,可以使用如下方式:

do {
    let jsonObj = try JSONSerialization.jsonObject(with: data)
    // 生成JSON数据时添加无转义配置
    let formattedData = try JSONSerialization.data(withJSONObject: jsonObj, options: [.prettyPrinted, .withoutEscapingSlashes])
    if let formattedStr = String(data: formattedData, encoding: .utf8) {
        // 此处的formattedStr就是无Unicode转义的完整JSON字符串
        print(formattedStr)
    }
} catch {
    completion(.failure(.decodingProblem))
}

额外优化提示

你当前请求头中的Content-Type配置有误,正确值应为application/json而非http,可以同步修改避免出现其他解析问题。

内容的提问来源于stack exchange,提问作者Jurij Husak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 00:15:00