Неверный 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)!
Другие вопросы по тегам