Как разобрать JSON с пользовательскими параметрами с помощью протокола Codable

У меня есть JSON с ключами

{  
   "yearOfManufacture":"20/9/2018",
   "carSize":8,
   "isNew":true,
   "carAssets":[  
      {  
         "color":"5761807993001",
         "nativeId":"{\"app\":\"1234/Car/Native_App\",\"web\":\" /8888/Car/Native_Car_Desktop\"}"
      }
   ]
}

Я пытаюсь выполнить синтаксический анализ с использованием протокола Codable с моделями структур

struct Cars: Codable {
   var yearOfManufacture: String?
   var carSize: Int = 0
   var isNew: Bool = true
   var carAssets: [CarAssests]?
}

struct CarAssests: Codable { 
   var color: String?
   var nativeId: String?
}

Я получаю сообщение об ошибке типа Не удалось прочитать данные, потому что они имеют неправильный формат. Я попытался использовать CodingKeys с контейнером декодера, не получив точного типа "nativeId": " {\ "app \": \ "1234 / Car / Native_App \", \ "web \": \ "/ 8888 / Car / Native_Car_Desktop \"} " не получает точного типа данных этого.

let decoder = JSONDecoder()
        decoder.dataDecodingStrategy = .deferredToData
        if let jsonData = jsonString.data(using: .utf8) {
            do {

                print(jsonData)
                let assets = try decoder.decode(Cars.self, from: jsonData)
                print(assets)
            } catch {
                print(error.localizedDescription)
            }
        }

person salman siddiqui    schedule 31.05.2018    source источник
comment
Что вы имеете в виду, если я удалю ключ nativeId?   -  person Mihai Fratu    schedule 31.05.2018
comment
если я удалю nativeId из JSON, он будет успешно проанализирован !!   -  person salman siddiqui    schedule 31.05.2018
comment
nativeId - это строка JSON, закодированная как JSON. он не будет анализироваться таким же образом, вам нужно будет вручную отсортировать его   -  person Scriptable    schedule 31.05.2018
comment
Мне нужно кодировать полный JSON или только ключ   -  person salman siddiqui    schedule 31.05.2018
comment
Вы можете показать декларацию jsonString? Вы читаете его из файла или используете многострочный строковый литерал?   -  person Sweeper    schedule 31.05.2018
comment
используя многострочную строку.   -  person salman siddiqui    schedule 31.05.2018
comment
В многострочной строке необходимо избегать всех обратных косых черт.   -  person vadian    schedule 31.05.2018


Ответы (1)


Бьюсь об заклад, вы делаете что-то вроде этого:

let jsonString = """
{
"yearOfManufacture": "20/9/2018",
"carSize": 8,
"isNew": true,
"carAssets": [
{
"color": "5761807993001",
"nativeId": "{\"app\":\"1234/Car/Native_App\",\"web\":\" /8888/Car/Native_Car_Desktop\"}"
}
]
}
"""

В многострочной строке и \", и " означают символ ". Итак, вы должны написать \\", чтобы получить два символа \ и ":

let jsonString = """
{
"yearOfManufacture": "20/9/2018",
"carSize": 8,
"isNew": true,
"carAssets": [
{
"color": "5761807993001",
"nativeId": "{\\"app\\":\\"1234/Car/Native_App\\",\\"web\\":\\" /8888/Car/Native_Car_Desktop\\"}"
}
]
}
"""
person Sweeper    schedule 31.05.2018
comment
Да, это была проблема, как ее решить, если мы получаем из файла или веб-службы - person salman siddiqui; 31.05.2018
comment
@salmansiddiqui, вам не о чем беспокоиться, если служба правильно форматирует свой JSON. Только в строковых литералах нужно соблюдать осторожность, чтобы экранировать символы. - person Sweeper; 31.05.2018