typeMismatch в модели декодирования снова JSONEncoder и JSONDecoder swift 5

Я пытаюсь обновить значения в модели и использовать декодирование и кодирование операции JSON. Я создал модель по данным. Все работает нормально, но если я снова декодирую свою модель, она выдает ошибку typeMismatch. Я пробовал, но безуспешно. Кто-нибудь может мне помочь?

Примечание. При печати исходных данных JSON и закодированных данных вы можете увидеть разницу. В закодированных данных тег "appointments": отсутствует, как я могу это обработать и добавить.

Исходные данные JSON:

{
  "appointments": [
    {
      "id": 15473454,
      "isProjectManual": false,
      "projectType": "i",
      "appointmentHour": "05:04",
      "projectName": "Farid Farjad",
      "warmingType": "b",
      "subTitle": "4874345 ",
      "projectDistrict": "Çay",
      "projectFirmName": "Test Firması",
      "controlHour": "",
      "date": "2019-12-26T05:04:00",
      "backgroundColorLight": "#cfd8dc",
      "backgroundColorDark": "#556f7b"
    }
  ],
  "isSuccess": true,
  "message": "İşlem Başarılı.",
  "statusCode": 1
}

Модели:

struct ResponseData: Codable {

    let appointments : [Appointment]?
    let isSuccess : Bool?
    let statusCode : Int?
    let message : String?

}

struct Appointment : Codable {

    let appointmentHour : String?
    let backgroundColorDark : String?
    let backgroundColorLight : String?
    let controlHour : String?
    let date : String?
    let id : Int?
    let isProjectManual : Bool?
    let projectDistrict : String?
    let projectFirmName : String?
    let projectName : String?
    let projectType : String?
    let subTitle : String?
    let warmingType : String?
}

Кодировать:

var Appdata : [Appointment]? 

let jsonData = try! JSONEncoder().encode(self.Appdata)
let jsonString = String(data: jsonData, encoding: .utf8)!
print(jsonString)

Кодировать отпечатки

[
  {
    "projectName": "Farid Farjad",
    "id": 15473454,
    "subTitle": "4874345 ",
    "appointmentHour": "05:04",
    "projectDistrict": "Çay",
    "projectFirmName": "Test Firması",
    "date": "2019-12-26T05:04:00",
    "backgroundColorLight": "#cfd8dc",
    "backgroundColorDark": "#556f7b",
    "isProjectManual": false,
    "controlHour": "",
    "projectType": "i",
    "warmingType": "b"
  }
]

Код декодирования

let dec = JSONDecoder()
let resp = try dec.decode(ResponseData.self, from: jsonData)
print(resp)

Расшифровать отпечатки

typeMismatch(Swift.Dictionary<Swift.String, Any>, Swift.DecodingError.Context(codingPath: [], debugDescription: "Expected to decode Dictionary<String, Any> but found an array instead.", underlyingError: nil))

person Community    schedule 27.01.2020    source источник
comment
попробуй let resp = try dec.decode([Appointment].self, from: jsonData)   -  person chirag90    schedule 27.01.2020
comment
не могли бы вы предоставить больше информации о let jsonData = try! JSONEncoder().encode(self.Appdata). Что такое self.Appdata?   -  person Vadim Nikolaev    schedule 27.01.2020
comment
@VadimNikolaev Appdata: var Appdata : [Appointment]?   -  person    schedule 27.01.2020
comment
@ chirag90 да, это работает, я пробовал, но хочу использовать с ResponseData.self   -  person    schedule 27.01.2020
comment
@NewBieMobile, вы можете получить свой let result = try JSONDecoder().decode(ResponseData.self, from: data), а затем append на result.appointments свой Appointment(appointmentHour: "05:04", backgroundColorDark: "#cfd8dc", backgroundColorLight: "#556f7b", controlHour: "", date: "2019-12-26T05:04:00", id: 15473454, isProjectManual: false, projectDistrict: "Çay", projectFirmName: "Test Firması", projectName: "Farid Farjad", projectType: "i", subTitle: "4874345 ", warmingType: "b") и работать с двумя встречами (например, вернуться с completionHandler)   -  person Vadim Nikolaev    schedule 27.01.2020
comment
Вместо этого кодируйте ResponseData   -  person Joakim Danielson    schedule 27.01.2020


Ответы (1)


Ваша проблема в том, что вы пытаетесь закодировать

var Appdata : [Appointment]? 
let jsonData = try! JSONEncoder().encode(self.Appdata)

Это массив встреч, а затем попытка декодировать jsonData в словарь

let dec = JSONDecoder()
let resp = try dec.decode(ResponseData.self, from: jsonData)

Вы можете изменить кодировку или декодирование.

Кодировка

Измените кодировку на следующую.

var Appdata : ResponseData?

Использование будет таким, как вы хотите использовать.

let resp = try dec.decode(ResponseData.self, from: jsonData)

Расшифровка

Если вы хотите использовать текущую функцию кодирования, вам нужно будет декодировать ее следующим образом.

let resp = try dec.decode([Appointment].self, from: jsonData)
person chirag90    schedule 27.01.2020