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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 16:54:21