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

Swift Alamofire中如何将普通JSON转换为转义JSON字符串?

解决Swift Alamofire中转义JSON字符串的问题

嘿,我之前用Alamofire开发时刚好碰到过一模一样的需求!服务器要的其实是把整个JSON结构当成一个转义后的字符串来接收,而不是直接传JSON对象。下面给你两种实用的解决方法:

方法一:用JSONSerialization处理字典(适合无模型场景)

如果你是从响应中拿到了[String: Any]类型的字典,直接用系统的JSONSerialization就能完成转换:

// 假设这是你从响应解析得到的JSON字典
let responseDict: [String: Any] = [
    "status": 1,
    "id": "1bcc3331b09d32f7439ad9d5f2acfb35",
    "progress": [
        [
            "airline_code": "SRI",
            "ctr": 0,
            "rate": 5,
            "state": 1,
            "data": nil
        ]
    ]
]

do {
    // 第一步:把字典序列化成Data
    let jsonData = try JSONSerialization.data(withJSONObject: responseDict, options: [])
    // 第二步:把Data转成字符串,自动完成双引号转义
    if let escapedJsonString = String(data: jsonData, encoding: .utf8) {
        // 用debugPrint可以看到原始的转义字符(控制台直接print会自动显示未转义的)
        debugPrint(escapedJsonString)
        // 输出结果就是服务器需要的格式:
        // "{\"status\":1,\"id\":\"1bcc3331b09d32f7439ad9d5f2acfb35\",\"progress\":[{\"airline_code\":\"SRI\",\"ctr\":0,\"rate\":5,\"state\":1,\"data\":null}]}"
    }
} catch {
    print("JSON序列化失败:\(error.localizedDescription)")
}

方法二:用Codable模型处理(类型安全,推荐)

如果你的项目用了Codable来解析响应(这也是Alamofire推荐的方式),可以先定义对应模型,再编码成转义字符串:

第一步:定义Codable模型

struct ProgressItem: Codable {
    let airlineCode: String
    let ctr: Int
    let rate: Int
    let state: Int
    let data: String? // 若data可能为null,用可选类型即可;特殊情况可自定义NilCodable
    
    // 处理下划线命名的字段
    enum CodingKeys: String, CodingKey {
        case airlineCode = "airline_code"
        case ctr, rate, state, data
    }
}

struct ResponseModel: Codable {
    let status: Int
    let id: String
    let progress: [ProgressItem]
}

第二步:将模型编码为转义字符串

// 假设这是你从Alamofire响应解析得到的模型实例
let responseModel = ResponseModel(
    status: 1,
    id: "1bcc3331b09d32f7439ad9d5f2acfb35",
    progress: [
        ProgressItem(
            airlineCode: "SRI",
            ctr: 0,
            rate: 5,
            state: 1,
            data: nil
        )
    ]
)

do {
    let encoder = JSONEncoder()
    // 不需要额外配置,默认编码就会生成转义后的字符串
    let jsonData = try encoder.encode(responseModel)
    if let escapedJsonString = String(data: jsonData, encoding: .utf8) {
        debugPrint(escapedJsonString)
    }
} catch {
    print("模型编码失败:\(error.localizedDescription)")
}

注意事项:发送请求时的正确姿势

拿到转义后的字符串后,要确保它是作为字符串参数传递给服务器,而不是再次被Alamofire序列化。比如如果服务器要求参数名为json,请求代码应该是这样:

let parameters: [String: Any] = [
    "json": escapedJsonString // 直接传转义后的字符串
]

AF.request("你的服务器接口地址", method: .post, parameters: parameters, encoding: URLEncoding.default)
    .responseJSON { response in
        // 处理服务器响应
    }

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:45:34