Неверный JSON при разборе строки \n (в кавычках)
У меня проблема с Codable синтаксическим анализом... это мой пример кода:
class Test: Codable {
let resultCount: Int?
let quote: String?
}
var json = """
{
"resultCount" : 42,
"quote" : "My real quote"
}
""".data(using: .utf8)!
var decoder = JSONDecoder()
let testDecoded = try! decoder.decode(Test.self, from: json)
Здесь все работает как положено и объект Test создан.
Теперь мой бэкэнд отправляет мне строку цитаты с цитатой в середине... в этой форме (обратите внимание, \"реальная \"):
class Test: Codable {
let resultCount: Int?
let quote: String?
}
var json = """
{
"resultCount" : 42,
"quote" : "My \"real\" quote"
}
""".data(using: .utf8)!
var decoder = JSONDecoder()
let testDecoded = try! decoder.decode(Test.self, from: json)
Во втором случае декодер не может создать объект... и это мое сообщение об ошибке:
dataCorrupted (Swift.DecodingError.Context (codingPath: [], debugDescription: "Указанные данные не были действительными в формате JSON.", underError: Необязательный (Ошибка домена =NSCocoaErrorDomain Code=3840 "Нет строкового ключа для значения в объекте вокруг символа 4." UserInfo={NSDebugDescription= Нет строкового ключа для значения в объекте вокруг символа 4.})))
Есть ли способ решить эту проблему?
1 ответ
Чтобы включить кавычки в ваш JSON, должен быть \
символы перед кавычками в строке:
{
"resultCount" : 42,
"quote" : "My \"real\" quote"
}
Чтобы сделать это в строковом литерале Swift, вам нужно экранировать \
, Это приводит к "My \\"real\\" quote"
в многострочном строковом литерале Swift:
let json = """
{
"resultCount" : 42,
"quote" : "My \\"real\\" quote"
}
""".data(using: .utf8)!
let decoder = JSONDecoder()
let testDecoded = try! decoder.decode(Test.self, from: json)
Однако если вы работаете со стандартным, не многострочным строковым литералом, вам нужно экранировать как обратную косую черту, так и кавычку, что приводит к еще более запутанному виду \"My \\\"real\\\" quote\"
:
let json = "{\"resultCount\": 42, \"quote\" : \"My \\\"real\\\" quote\"}"
.data(using: .utf8)!