Swift 4 无法正确解码包含换行符("\n")的 JSON 数据。
Swift 4 无法正确解码包含换行符("\n")的 JSON 数据。
如果JSON数据包含换行符(\"\\n\"),Swift 4无法正确解码。针对这种情况,我该怎么做?请查看我的示例代码:\nvar userData = \"\"\"\n[\n {\n \"userId\": 1,\n \"id\": 1,\n \"title\": \"标题 \\n 包含换行符\",\n \"completed\": false\n }\n]\n\"\"\".data(using: .utf8)\nstruct User: Codable {\n var userId: Int\n var id: Int\n var title: String\n var completed: Bool\n}\ndo {\n let decoder = JSONDecoder()\n let model = try decoder.decode([User].self, from: userData!) // 解码JSON响应数据\n print(model)\n} catch let parsingError {\n print(\"错误\", parsingError)\n}\n
\n如果我将userData的值更改如下,此时它可以正确解码:\nvar userData = \"\"\"\n[\n {\n \"userId\": 1,\n \"id\": 1,\n \"title\": \"标题 \\\\n 包含换行符\",\n \"completed\": false\n }\n]\n\"\"\".data(using: .utf8)\n
问题的原因是在Swift中,"\n"表示换行符,而不是JSON中的有效字符。解决方法是将换行符转义为"\n",这样JSON就变成了有效的格式。
在Swift中,如果直接将包含换行符的JSON字符串赋值给变量,就会出现解码错误。因此,需要将换行符转义为"\n"来解决这个问题。
let jsonString = """
[
{
"userId": 1,
"id": 1,
"title": "Title \\n with newline",
"completed": false
}
]
"""
struct Todo: Codable {
let userId: Int
let id: Int
let title: String
let completed: Bool
}
if let jsonData = jsonString.data(using: .utf8) {
let decoder = JSONDecoder()
do {
let todos = try decoder.decode([Todo].self, from: jsonData)
print(todos)
} catch {
print(error)
}
}
在上面的代码中,将换行符转义为"\n",然后将JSON字符串转换为Data类型。接下来,使用JSONDecoder进行解码,并将结果存储在Todo类型的数组中。如果解码成功,则打印结果;否则,打印错误信息。
无需担心这个问题,因为提供数据的服务器应该提供有效的JSON。如果你通过编程方式获取响应,就不会出现这个问题。
Swift 4在解析JSON数据时,如果数据中包含换行符("\n"),会出现无法正确解析的问题。下面是出现这个问题的原因以及解决方法。
问题原因:
这是一个无效的JSON格式,因为JSON规范要求字符串中的换行符需要进行转义。而在给定的JSON中,字符串"title"的值中包含了一个换行符,没有进行转义,导致JSON解析器无法正确解析。
解决方法:
为了解决这个问题,我们需要对给定的JSON进行修改,将换行符进行转义。修改后的JSON如下:
[
{
"userId": 1,
"id": 1,
"title": "Title \\n with newline",
"completed": false
}
]
在修改后的JSON中,字符串"title"的值中的换行符被转义为"\n",符合JSON规范。
除此之外,我们还需要使用Swift提供的Codable协议来定义一个模型对象User,用于解析JSON数据。修改后的代码如下:
var userData: [[String:Any]] = [
[
"userId": 1,
"id": 1,
"title": "Title \\n with newline",
"completed": false
]
]
struct User: Codable {
var userId: Int
var id: Int
var title: String
var completed: Bool
}
do {
let data = try JSONSerialization.data(withJSONObject: userData, options: [])
let decoder = JSONDecoder()
let model = try decoder.decode([User].self, from: data!)
print(model)
} catch let parsingError {
print("Error", parsingError)
}
在修改后的代码中,我们首先使用JSONSerialization将修改后的JSON数据转换为Data类型的数据。然后,我们使用JSONDecoder将Data数据解码为模型对象User的数组。最后,我们打印出解析得到的模型对象。
通过对给定的JSON进行修改,并使用Codable协议进行解析,我们成功解决了Swift 4在解析包含换行符的JSON数据时出现的问题。