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

Swift中处理字典header:移除换行符并转换为嵌套字典问题

解决方案(Swift 实现)

问题根源

你拿到的header值是非标准类字典字符串(用=分隔键值、;结尾、部分值无引号),直接序列化会因格式不合法导致引号丢失或解析失败,必须先将其转换为标准JSON格式,再进行后续处理。

分步实现

  1. 清理并转换header字符串为标准JSON
    写个工具函数处理格式问题:

    func convertHeaderStringToJSON(_ input: String) -> String? {
        // 去掉换行和多余空格
        var cleaned = input.replacingOccurrences(of: "\n", with: "")
            .replacingOccurrences(of: "    ", with: "")
        
        // 把=替换成:,同时给键值对补全引号(处理无引号的值)
        let pattern = #"(\w+)\s*=\s*(["]?)(.*?)\2?;"#
        cleaned = cleaned.replacingOccurrences(of: pattern, with: "\"$1\":\"$3\",", options: .regularExpression)
        
        // 去掉最后一个多余的逗号,修复JSON格式
        if let lastCommaIndex = cleaned.lastIndex(of: ",") {
            cleaned.remove(at: lastCommaIndex)
        }
        
        return cleaned
    }
    
  2. 解析处理后的字符串为字典
    将转换后的JSON字符串转成[String: Any]:

    // 原输入字典
    let originalDict: [String: String] = [
        "header": "{\n    ephemeralPublicKey = \"xxx\";\n    publicKeyHash = \"xxx\";\n    transactionId = xxx;\n}",
        "version": "xxx",
        "signature": "xxx",
        "data": "xxx"
    ]
    
    guard let headerString = originalDict["header"],
          let jsonHeaderString = convertHeaderStringToJSON(headerString),
          let headerData = jsonHeaderString.data(using: .utf8),
          let headerDict = try? JSONSerialization.jsonObject(with: headerData, options: []) as? [String: String] else {
        // 处理解析失败的情况
        fatalError("Header解析失败")
    }
    
  3. 构建目标结构并序列化
    组装paymentData结构,用系统API生成标准JSON:

    // 构建最终结构
    let paymentData: [String: Any] = [
        "paymentData": [
            "data": originalDict["data"]!,
            "signature": originalDict["signature"]!,
            "header": headerDict,
            "version": originalDict["version"]!
        ]
    ]
    
    // 序列化JSON,保证格式正确(带引号)
    if let jsonData = try? JSONSerialization.data(withJSONObject: paymentData, options: .prettyPrinted),
       let jsonString = String(data: jsonData, encoding: .utf8) {
        print(jsonString)
        // 输出就是你要的预期结构,引号完整
    }
    

关键说明

  • 正则匹配是核心:通过正则统一给键和值加上双引号,解决部分值无引号的问题
  • 必须转成标准JSON再解析:手动拼接字典容易出错,用系统JSONSerialization能保证引号和格式的合法性
  • 用Codable更稳妥:可以定义对应模型类,避免Any类型的不确定性,示例:
    struct PaymentData: Codable {
        let data: String
        let signature: String
        let header: Header
        let version: String
    }
    
    struct Header: Codable {
        let ephemeralPublicKey: String
        let publicKeyHash: String
        let transactionId: String
    }
    
    struct Root: Codable {
        let paymentData: PaymentData
    }
    
    解析后用JSONEncoder序列化,同样能得到带完整引号的标准JSON。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 23:33:09