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

Swift中如何正确生成美观格式化的JSON字符串?

解决Swift JSON格式化日志中转义字符问题

问题原因

你遇到的转义字符问题,本质是直接打印了可选类型的字符串描述。jsonString是String?类型,print输出时会把字符串内部的双引号转义,同时带上Optional()的包裹格式,导致显示出多余的\\\"。另外代码里用try!存在崩溃风险,生产环境不建议使用。

解决方案

  1. 对可选类型的JSON字符串解包,直接打印字符串本体
  2. 替换try!为do-catch处理编码错误,避免崩溃
  3. 保留JSONEncoder的.prettyPrinted配置,确保输出格式化的JSON

修正后的代码

extension Encodable {
    var jsonString: String? {
        let encoder = JSONEncoder()
        encoder.dateEncodingStrategy = .iso8601
        // 启用格式化输出,可选添加.sortedKeys让键有序
        encoder.outputFormatting = [.prettyPrinted, .sortedKeys]
        do {
            let jsonData = try encoder.encode(self)
            return String(decoding: jsonData, as: UTF8.self)
        } catch {
            print("JSON编码错误: \(error.localizedDescription)")
            return nil
        }
    }
}

struct Foo: Codable {
    let string1: String
    let string2: String
    let val: Int
}

let foo = Foo(string1: "string1", string2: "string2", val: 42)
// 解包后打印,避免转义字符
if let formattedJson = foo.jsonString {
    print(formattedJson)
}

输出结果

{
  "string1" : "string1",
  "string2" : "string2",
  "val" : 42
}

如果你的需求是要给JSON字符串外层再套一层双引号(比如示例中的格式),可以把格式化后的JSON再作为字符串值进行一次编码,但这通常只用于需要把JSON嵌入到其他JSON的场景,日志打印一般不需要:

if let formattedJson = foo.jsonString {
    let wrapper = ["json": formattedJson]
    print(wrapper.jsonString ?? "")
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 00:20:31