Swift中如何正确生成美观格式化的JSON字符串?
解决Swift JSON格式化日志中转义字符问题
问题原因
你遇到的转义字符问题,本质是直接打印了可选类型的字符串描述。jsonString是String?类型,print输出时会把字符串内部的双引号转义,同时带上Optional()的包裹格式,导致显示出多余的\\\"。另外代码里用try!存在崩溃风险,生产环境不建议使用。
解决方案
- 对可选类型的JSON字符串解包,直接打印字符串本体
- 替换
try!为do-catch处理编码错误,避免崩溃 - 保留
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
相关产品推荐
相关产品推荐

