使用Codable序列化为JSON时Swift String转义

tof*_*ffe 24 macos json ios swift codable

我正在尝试将我的对象序列化如下:

import Foundation

struct User: Codable {
    let username: String
    let profileURL: String
}

let user = User(username: "John", profileURL: "http://google.com")

let json = try? JSONEncoder().encode(user)

if let data = json, let str = String(data: data, encoding: .utf8) {
    print(str)
}
Run Code Online (Sandbox Code Playgroud)

但是在macOS上我得到以下内容:

{"profileURL":"http:\/\/google.com","username":"John"}
Run Code Online (Sandbox Code Playgroud)

(注意转义'/'字符).

在Linux机器上,我得到:

{"username":"John","profileURL":"http://google.com"}
Run Code Online (Sandbox Code Playgroud)

如何让JSONEncoder在macOS上返回未转义的表单?

我需要JSON中的字符串严格未转义.

tof*_*ffe 11

我最终使用replacingOccurrences(of:with:),这可能不是最好的解决方案,但它解决了这个问题:

import Foundation

struct User: Codable {
    let username: String
    let profileURL: String
}

let user = User(username: "John", profileURL: "http://google.com")

let json = try? JSONEncoder().encode(user)

if let data = json, let str = String(data: data, encoding: .utf8)?.replacingOccurrences(of: "\\/", with: "/") {
    print(str)
    dump(str)
}
Run Code Online (Sandbox Code Playgroud)


Ash*_*ish 6

我知道了。问题是它不包含任何 \ 字符。swift 的特性是它总是在控制台上返回这样的字符串。解决方法是 j-son 解析它。

不过,您可以在下面使用“/”字符串替换 '\/' 的解决方案使用

 let newString = str.replacingOccurrences(of: "\\/", with: "/") 
 print(newString)
Run Code Online (Sandbox Code Playgroud)


Ind*_*ore 6

对于iOS 13 + / macOS 10.15+,

您可以使用.withoutEscapingSlashesjson解码器选项以避免转义斜线

let user = User(username: "John", profileURL: "http://google.com")

let jsonEncoder = JSONEncoder()
jsonEncoder.outputFormatting = .withoutEscapingSlashes
let json = try? jsonEncoder.encode(user)

if let data = json, let str = String(data: data, encoding: .utf8) {
    print(str)
}
Run Code Online (Sandbox Code Playgroud)

控制台O / P

{“ profileURL”:“ http://google.com ”,“用户名”:“ John”}


注意:正如Martin R在评论中提到的那样,\/它是有效的JSON转义序列。