Swift中处理字典header:移除换行符并转换为嵌套字典问题
解决方案(Swift 实现)
问题根源
你拿到的header值是非标准类字典字符串(用=分隔键值、;结尾、部分值无引号),直接序列化会因格式不合法导致引号丢失或解析失败,必须先将其转换为标准JSON格式,再进行后续处理。
分步实现
清理并转换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 }解析处理后的字符串为字典
将转换后的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解析失败") }构建目标结构并序列化
组装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
相关产品推荐
相关产品推荐

