typeMismatch в модели декодирования снова JSONEncoder и JSONDecoder swift 5 - PullRequest
1 голос
/ 27 января 2020

Я пытаюсь обновить значения в модели и использую 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))

1 Ответ

2 голосов
/ 27 января 2020

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

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)
...