gpt4 book ai didi

json - Swift JSONDecoder 无法使用转义字符解码有效的 JSON

转载 作者:行者123 更新时间:2023-12-03 16:50:43 34 4
gpt4 key购买 nike

在 Playgrounds 中,以下代码会产生错误:

import Foundation

struct Model: Codable {

let textBody: String

enum CodingKeys: String, CodingKey {
case textBody = "TextBody"
}
}

let json = """
{
"TextBody": "First Line\n\nLastLine"
}
""".data(using: .utf8)!


let model = try! JSONDecoder().decode(Model.self, from: json)

fatal error :“尝试!”表达式意外引发错误:Swift.DecodingError.dataCorrupted(Swift.DecodingError.Context(codingPath: [], debugDescription: "The given data was not valid JSON.",underlyingError: Optional(Error Domain=NSCocoaErrorDomain Code=3840 "Unescaped control字符 27 周围的字符。” UserInfo={NSDebugDescription=字符 27 周围的未转义控制字符。}))):文件 MyPlayground.playground,第 19 行

根据 JSONLint,上面的 JSON 是完全有效的。那么什么给呢?

更新:

我需要一个解决方案来处理从 API 返回的数据。这是我到目前为止想出的东西,但它很糟糕......
if let data = data,
let dataStr = String(data: data, encoding: .utf8),
let cleanData = dataStr.replacingOccurrences(of: "\n", with: "", options: .regularExpression).data(using: .utf8)
{

do {

let response = try JSONDecoder().decode(T.Response.self, from: cleanData)

completion(.success(response))

} catch (let error) {

print(error.localizedDescription)

completion(.failure(ApiError.decoding))

}

}

最佳答案

您的 json在您的操场上表示不正确。它由带有 \n 的字符串字面量构成在里面。但是在字符串转换为 Data 之前,它会被替换为换行符。 .但是 JSON 字符串中不允许出现换行符。您需要两个单独的字符,即 \其次是 n在 JSON 中的字符串中。您可以通过转义 \ 来做到这一点。与另一个 \ ,例如:

let json = """
{
"TextBody": "First Line\\n\\nLastLine"
}
""".data(using: .utf8)!

或者,在 Swift 5 及更高版本中,您可以使用扩展字符串分隔符,例如:
let json = #"""
{
"TextBody": "First Line\n\nLastLine"
}
"""#.data(using: .utf8)!

或者:
let json = #"{"TextBody": "First Line\n\nLastLine"}"#
.data(using: .utf8)!

如果您的 Web 服务在其字符串值中返回带有换行符 ( 0x0a ) 而不是 \ 的 JSON,我会感到非常惊讶。字符后跟 n特点。只有当一些缺乏经验的后端开发人员手动构建 JSON 而不是使用正确执行此操作的函数时,才会发生这种情况。

你说你在看 \n在 postman 。这表明您的服务器响应是正确的,有两个字符, \其次是 n , 在字符串中。例如,这里有一个 Web 服务回显了我的输入,并且这个 JSON 格式良好,格式为 \其次是 n :

enter image description here

如果您的输出如上所示,那么您的 JSON 是有效的,并且上面代码片段中的问题只是您在 Playground 中的 Swift 代码中如何在字符串文字中表示此 JSON 的一种表现。

只有看到 "First line才需要担心在此 postman “原始” View 中的一行,请参阅 Lastline"在下一行(大概没有\n)。

最重要的是,我们应该忽略您的操场中的错误。解析您的实际服务器响应(不是将 JSON 剪切和复制到代码中,或者至少在没有那些扩展字符串文字的情况下不能)。重点关注解析实际服务器响应时遇到的错误(如果有)。我敢打赌,如果您在实际服务器响应上运行解析器,则不会出现“未转义的控制字符”错误。

关于json - Swift JSONDecoder 无法使用转义字符解码有效的 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57796640/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com