由于字符周围的值无效,无法解码 json
Posted
技术标签:
【中文标题】由于字符周围的值无效,无法解码 json【英文标题】:Unable to decode a json due to Invalid value around character 【发布时间】:2019-12-18 10:31:18 【问题描述】:这是我尝试使用Decodable
协议解码的 JSON。
我收到此错误消息:
Swift.DecodingError.dataCorrupted(Swift.DecodingError.Context(codingPath: [], debugDescription: "给定的数据不是有效的 JSON。",underlyingError: Optional(Error Domain=NSCocoaErrorDomain Code=3840 "字符周围未转义的控制字符718.
let jsonData = """
"pagination":
"per_page": 10,
"previous_page": null,
"total": 51,
"next_page": 2,
"current_page": 1
,
"collection": [
"id":408979,
"asker_id":948560,
"answer_id":"0c5e0296-6df8-47f0-8ebe-978cdfbaeb0d",
"package_id":"00000000-0000-0000-0000-000000000000",
"category_id":40,
"address":"27 Boulevard Jean Rose, 77100 Meaux, France",
"city":"Meaux",
"created_at":"2019-12-16T11:25:44+01:00",
"updated_at":"2019-12-16T11:25:44+01:00",
"title":"voici le test de la demande",
"description":"Titre : voici le test de la demande\nDescription : sdfghjhhhhhhhhhhhhhbvgnvh\nLocalisation : Meaux\nEst-ce pour une société ? : Non",
"state":"open",
"visibility":"public",
"share_url":"https://dev.stoo.com/stoot/mission/voici-le-test-de-la-demande-408979",
"shareUrl":"https://dev.stoo.com/stoot/mission/voici-le-test-de-la-demande-408979",
"lat":"48.9616755",
"lng":"2.8812038"
]
""".data(using: .utf8)!
我检查了有无键 description
,这是相关的值,这是问题的原因。
这是我的模型:
struct Results : Decodable
struct Pagination : Codable
let total: Int
enum CodingKeys : String, CodingKey
case total
struct Collection : Decodable
let id: Int
let pagination: Pagination
let collection: [Collection]
let model = try! JSONDecoder().decode(PagedCompanies.self, from: jsonData)
此响应来自 API,无法更新。如何更新我的模型以正确解码 json?
【问题讨论】:
看看Swift JSONDecoder can't decode valid JSON with escape characters。您的 JSON 字符串在 Swift 中无效,您需要使用\` in String literals instead of
\'`。当直接来自 URLRequest 而不是将其声明为字符串时,该 JSON 应该可以很好地解码。
【参考方案1】:
你自己很快就能算出718的位置:
替换
let jsonData = """
...
""".data(using: .utf8)!
与
let jsonString = """
...
"""
let jsonData = Data(jsonString.utf8)
添加
let startIndex = jsonString.index(jsonString.startIndex, offsetBy: 718)
print(jsonString[startIndex...])
并运行代码。
它立即显示受影响的角色是\n
。在文字多行字符串语法中,任何反斜杠必须用第二个反斜杠转义
...
"description":"Titre : voici le test de la demande\\nDescription : sdfghjhhhhhhhhhhhhhbvgnvh\\nLocalisation : Meaux\\nEst-ce pour une société ? : Non"
...
如果数据来自服务器,则不得发生此错误。
结构是正确的。您甚至不需要 total
的 CodingKeys。
【讨论】:
以上是关于由于字符周围的值无效,无法解码 json的主要内容,如果未能解决你的问题,请参考以下文章
Sencha Touch 错误您正在尝试解码 ASP.NET 中返回的无效 JSON 字符串 HTML 页面
NSDebugDescription=字符 0 周围的值无效。- JSON 错误
使用 PHP、curl 解码从 Flickr API 返回的 json 字符串
UnicodeDecodeError:“utf8”编解码器无法解码位置 3131 中的字节 0x80:无效的起始字节