Swift 3 JSONSerialization 序列化字典包含 \ 字符

Posted

技术标签:

【中文标题】Swift 3 JSONSerialization 序列化字典包含 \\ 字符【英文标题】:Swift 3 JSONSerialization serialize dictionary contain \ characterSwift 3 JSONSerialization 序列化字典包含 \ 字符 【发布时间】:2017-04-08 17:01:51 【问题描述】:

我正在使用 RESTful API 向远程服务器发出请求。我创建了一个字典,然后使用 JSONSerialization 将其序列化为 Data。问题是当序列化日期时间 dd/mm/yyyy 时,它会自动添加一个 \ 字符。此问题可能是由于从 Dictionary 到 Data 或 Data 到 String 的转换。我不确切知道。

如何删除这个 \ 字符

以下是我在应用程序上的代码:

var dic = [String : String]()
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd/MM/yyyy hh:mm:ss"
let current : String = dateFormatter.string(from: now)       
dic["RequestAt"] = current
// others set key-value
do 
    var request = URLRequest(url: URL(string: DOMAIN_NAME)!)
    request.httpMethod = "POST"
    request.timeoutInterval = 3
    request.addValue("application/json charset=utf-8", forHTTPHeaderField: "Content-Type")
    request.addValue("application/json charset=utf-8", forHTTPHeaderField: "Accept")
    let d = try JSONSerialization.data(withJSONObject: dic, options: [])
    let str = String.init(data: d, encoding: .utf8)
    print(str ?? "NOTHING") // Same result as server's receive
    request.httpBody = d
    let session = URLSession.shared

    session.dataTask(with: request)  data, response, err in
        //handle callback
    .resume()

 catch let error         
    print(error.localizedDescription)

但服务器端接收以下 json:


    "RequestAt":"08\/04\/2017 11:42:03",
    ....

感谢您的支持。

【问题讨论】:

您是否担心反斜杠或服务器不接受该格式?根据 JSON 规范,斜杠可以转义 服务器端的开发者反馈我这个问题。这个系统已经有一个在安卓上运行的应用,所以我必须更正这一步。 转义正斜杠完全有效,因此应在服务器端进行更正。 【参考方案1】:

你可以通过修剪字符串来解决这个问题。

current = current.stringByTrimmingCharactersInSet(NSCharacterSet.init(charactersInString: "\"))

【讨论】:

【参考方案2】:

我决定使用 Alamofire 提出请求。它只是一个临时解决方案,因为它必须使用第三方库。

我现在做什么:

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd/MM/yyyy hh:mm:ss"
let current : String = dateFormatter.string(from: now)   
let parameters: Parameters = [
    "RequestAt": current,
     ...
]

// Both calls are equivalent
Alamofire.request(DOMAIN_NAME, method: .post, parameters: parameters, encoding: JSONEncoding.default).responseJSON  response in
    //handle callback

【讨论】:

以上是关于Swift 3 JSONSerialization 序列化字典包含 \ 字符的主要内容,如果未能解决你的问题,请参考以下文章

44-Swift 之 JSONSerialization

Swift - JSONSerialization 无效的 JSON

Swift - JSONSerialization 无效的 JSON

swift 4 timeIntervalSinceReferenceDate 而不是 JSONSerialization 之后的实际日期字符串

JSONSerialization AnyObject SWIFT3 转换问题

Swift JSONSerialization.data 崩溃