Swift中ObjectMapper模型转JSON字符串反斜杠无法移除如何解决
Swift ObjectMapper 转JSON出现多余反斜杠问题解决
问题背景
在Swift项目中集成ObjectMapper框架时,定义了遵循Mappable协议的LeadsEntity模型:
class LeadsEntity: NSObject, Mappable { var name: String? var mobile: String? var address: String? var coords: String? var stime: String? override init() {} required init?(map: Map) {} func mapping(map: Map) { name <- map["name"] mobile <- map["mobile"] address <- map["address"] coords <- map["coords"] stime <- map["stime"] } }
编写了模型数组转JSON字符串的方法:
func json(from object: Any) -> String? { let JSONString = (object as! [LeadsEntity]).toJSONString(prettyPrint: true)?.replacingOccurrences(of: "\n", with: "").replacingOccurrences(of: " ", with: "") return JSONString }
实际使用时发现输出的JSON字符串带有反斜杠\,尝试调用字符串替换方法移除反斜杠未生效。
核心原因
- 最常见的情况是控制台打印的转义显示:Xcode控制台直接打印String类型的JSON内容时,会自动为字符串内部的双引号添加
\作为转义标识,这个反斜杠仅存在于控制台的展示结果中,并不是字符串本身包含的字符,因此替换方法无法匹配到目标字符,自然不会生效。 - 少数情况是二次序列化导致的真实转义:如果拿到
toJSONString()返回的字符串后,又将该字符串作为普通值传入JSON序列化方法生成新的JSON,会导致字符串内部的引号被加上真实存在的反斜杠转义。
解决方案
- 控制台显示反斜杠无需特殊处理:此时字符串本身是完全合法的JSON格式,直接用于网络传参、本地存储等业务场景都不会携带多余反斜杠。如果需要查看格式化后的无转义JSON内容,可以用如下方式打印:
if let jsonStr = leadsList.toJSONString(), let jsonData = jsonStr.data(using: .utf8), let jsonObj = try? JSONSerialization.jsonObject(with: jsonData), let prettyData = try? JSONSerialization.data(withJSONObject: jsonObj, options: .prettyPrinted), let prettyStr = String(data: prettyData, encoding: .utf8) { print(prettyStr) }
- 移除冗余的字符串替换逻辑:ObjectMapper的
toJSONString()方法默认prettyPrint参数为false,生成的就是无换行、无多余缩进的压缩JSON串,不需要手动替换换行和空格,优化后的转换方法如下:
func json(from leadsList: [LeadsEntity]) -> String? { return leadsList.toJSONString() }
- 排查二次序列化逻辑:如果确实存在真实的反斜杠字符,检查业务代码,不要将已经生成完成的JSON字符串作为普通属性再次执行JSON序列化操作,直接使用
toJSONString()的返回结果即可。
内容的提问来源于stack exchange,提问作者Rahul Gupta
相关产品推荐
相关产品推荐

