Swift构造无多余双引号的JSON数组字符串问题咨询
Swift构造指定格式JSON数组字符串方案
核心问题原因
你之前遇到的报错和格式错误,本质是混淆了「Swift原生数据结构」和「JSON字符串格式」:
- Swift中没有以
{开头的对象字面量语法,你不能直接写{"packageId": "1"}这种格式的变量,这种写法是JS/TS的语法,在Swift里对应的是[String: Any]类型的字典 - 手动拼接JSON字符串、用字符串替换处理转义的方案容错率极低,很容易生成非法格式的JSON,完全不推荐
最优方案:用系统JSON序列化生成(零手动转义)
这是Swift里生成JSON字符串的标准做法,全程不需要手动拼引号、处理转义字符:
- 首先构造字典类型的数组,不要存拼接好的字符串
// 数组元素是[String: Any]类型的字典,不是字符串 var packageJson: [[String: Any]] = [] for package in packages { if let pId = package.packageId { // 直接追加字典元素即可 packageJson.append(["packageId": pId]) } }
- 调用系统自带的
JSONSerialization把数组序列化为JSON数据,再转成字符串就是你需要的最终格式
do { let jsonData = try JSONSerialization.data(withJSONObject: packageJson, options: []) // 得到的stringJson就是目标格式:"[{\"packageId\":\"1\"}, {\"packageId\":\"2\"}...]" let stringJson = String(data: jsonData, encoding: .utf8) ?? "" } catch { // 处理序列化异常,正常情况下只要数据类型合法不会走到这里 print("JSON生成失败:\(error.localizedDescription)") }
这个方案会自动处理所有转义逻辑,不管packageId是整数、字符串,还是后续你要加其他字段,都能生成符合RFC规范的合法JSON,不会出现格式错误
字符串替换方案(仅作参考,生产环境禁用)
如果你暂时不想改现有拼接逻辑,非要用替换的方式修正格式,要注意你之前的替换规则写错了:\(packageJson)输出的字符串数组的debug描述,是用"包裹每个字符串元素,元素之间用, 分隔,你需要替换的是这些包裹元素的引号,不是花括号的转义:
var stringJson = "\(packageJson)" // 替换数组开头的[" 为 [ stringJson = stringJson.replacingOccurrences(of: "[\"", with: "[") // 替换数组结尾的"] 为 ] stringJson = stringJson.replacingOccurrences(of: "\"]", with: "]") // 替换元素之间的分隔符 "," 为 , stringJson = stringJson.replacingOccurrences(of: "\", \"", with: ", ")
警告:这个方案容错率为0,只要你的packageId值里包含引号、反斜杠、逗号这类特殊字符,生成的结果就是非法JSON,绝对不要在正式环境使用。
内容的提问来源于stack exchange,提问作者Mel
相关产品推荐
相关产品推荐

