尝试解析带引号的 JSON 响应时出错

Posted

技术标签:

【中文标题】尝试解析带引号的 JSON 响应时出错【英文标题】:Getting error when try to parsing JSON Response with quotation marks 【发布时间】:2019-06-15 15:58:25 【问题描述】:

我有来自 API 的 JSON 响应,如下所示:

[
  "id":"6",
  "name":"Лилия",
  "description":"Сауна "Лилия" ждёт всех тех, кто хочет отдохнуть от суеты в специально созданной для этого атмосфере тепла и уюта. В Вашем распоряжении 3 жаркие сауны, комнаты отдыха, 3 бассейна (один длиной 14 м), в котором Вы можете прекрасно поплавать. Для Вашего удобства всегда в продаже берёзовые и дубовые веники. При желании можно заказать блюда европейской кухни и напитки прямо в сауну. Рады видеть Вас в нашей сауне круглосуточно! Стоимость саун от 350 руб./час - более подробную информацию уточняйте у администратора"
]

尝试将其解码为我的模型 但出现错误:

dataCorrupted(Swift.DecodingError.Context(codingPath: [], debugDescription: "给定的数据不是有效的 JSON。", basedError: Optional(Error Domain=NSCocoaErrorDomain Code=3840 "字符 58 周围的对象格式错误。" UserInfo =NSDebugDescription=字符 58 周围的对象格式错误。)))

我的代码:

class NetworkService 
    var companies = [Company]()
    let session = URLSession(configuration: .default)

    func getCompanies(stringUrl: String) 

        guard let url = URL(string: stringUrl) else  return 

        let task = session.dataTask(with: url)  (data, response, error) in
            guard let dataResponse = data, error == nil else 
                    print(error?.localizedDescription ?? "Response Error")
                    return
            

            do 
                self.companies = try JSONDecoder().decode(Array<Company>.self, from: dataResponse)
             catch let parsingError 
                print("error", parsingError)
            
        

        task.resume()
    

型号:

struct Company: Codable 
    let name: String
    let description: String?

【问题讨论】:

description 中引号中的单词与name 中的单词相同是巧合还是一种模式? 这是一个巧合。翻译是这样的: "name": "Lilia", "description": "桑拿“Lilia”在等你们想要休息的人......" 【参考方案1】:

正确的 json (您需要在 " 内的任何 " 之前添加转义 \ 的键值)

[
    "id": "6",
    "name": "Лилия",
    "description": "Сауна \" Лилия \" ждёт всех тех, кто хочет отдохнуть от суеты в специально созданной для этого атмосфере тепла и уюта. В Вашем распоряжении 3 жаркие сауны, комнаты отдыха, 3 бассейна (один длиной 14 м), в котором Вы можете прекрасно поплавать. Для Вашего удобства всегда в продаже берёзовые и дубовые веники. При желании можно заказать блюда европейской кухни и напитки прямо в сауну. Рады видеть Вас в нашей сауне круглосуточно! Стоимость саун от 350 руб./час - более подробную информацию уточняйте у администратора"
]

试试

let str = String(data:data, encoding: .utf8)
let actual = str.replacingOccurrences(of: "Сауна \" Лилия \"", with: "Сауна \\" Лилия \\"")

那就改这个

 self.companies = try JSONDecoder().decode(Array<Company>.self, from: Data(actual.utf8))

【讨论】:

谢谢,但我无权访问 API 任何解决方法都适用于此特定响应尝试联系网络开发人员以更改该响应【参考方案2】:

Попытаюсь я:

import Foundation

let badJsonString = "\"id\":\"2\",\"description\":\"any \"bad\" description\""
let okJsonString  = badJsonString.replacingOccurrences(of: #"(?<= )\"|\"(?= )"#, with: "'", options: .regularExpression)
let jsonData = try JSONSerialization.jsonObject(with: Data(okJsonString.utf8))
print(jsonData)

【讨论】:

这只是代码,没有任何描述,请解释这是如何解决问题的

以上是关于尝试解析带引号的 JSON 响应时出错的主要内容,如果未能解决你的问题,请参考以下文章

解析 JSON 响应时出错 Cocoa 错误 3840

尝试获取 json 响应时出错 [Flutter]

yaml 解析时出错。预期 <block end>,但找到 <scalar>

尝试从 Swift 2.0 中的 json 解析数据时出错?

json解析时出错

将 XML 响应转换为 Json 时出错