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

Swift构造无多余双引号的JSON数组字符串问题咨询

Swift构造指定格式JSON数组字符串方案

核心问题原因

你之前遇到的报错和格式错误,本质是混淆了「Swift原生数据结构」和「JSON字符串格式」:

  • Swift中没有以{开头的对象字面量语法,你不能直接写{"packageId": "1"}这种格式的变量,这种写法是JS/TS的语法,在Swift里对应的是[String: Any]类型的字典
  • 手动拼接JSON字符串、用字符串替换处理转义的方案容错率极低,很容易生成非法格式的JSON,完全不推荐

最优方案:用系统JSON序列化生成(零手动转义)

这是Swift里生成JSON字符串的标准做法,全程不需要手动拼引号、处理转义字符:

  1. 首先构造字典类型的数组,不要存拼接好的字符串
// 数组元素是[String: Any]类型的字典,不是字符串
var packageJson: [[String: Any]] = []
for package in packages {
    if let pId = package.packageId {
        // 直接追加字典元素即可
        packageJson.append(["packageId": pId])
    }
}
  1. 调用系统自带的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 21:18:21