由于字符周围的值无效,无法解码 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:无效的起始字节

UnicodeDecodeError:“utf8”编解码器无法解码位置 0 的字节 0xa5:无效的起始字节

令牌身份验证失败:“utf-8”编解码器无法解码位置 0 中的字节 0xe4:无效的继续字节