为什么不解码对象?

问题描述 投票:1回答:1

因此,我试图调用后端api以获取类型为horse的对象,但在数据中获取了该对象,但是当我尝试对其进行解码时,它将无法正常工作。我该如何解决?您可以看到我的消息模型和我的马模型。我试图找到它们和json之间的区别,但我找不到。

消息模型

//
//  MessageType.swift
//  HorseStable
//
//  Created by Student on 30/12/2019.
//  Copyright © 2019 smartmobile. All rights reserved.
//

import Foundation

enum MessageType : Int,Decodable {
         case CREATE_HORSE
          case GET_HORSE
          case UPDATE_HORSE
          case DELETE_HORSE
          case GET_HORSES_ASSIGNED_TO_USER
          case REMOVE_HORSE_FROM_USER
          case ADD_HORSE_TO_USER

          /* USERS */
          case CREATE_USER
          case GET_USER
          case UPDATE_USER
          case DELETE_USER

          /* FACILITIES */
          case CREATE_FACILITY
          case GET_FACILITY
          case UPDATE_FACILITY
          case DELETE_FACILITY

          /* STALLS */
          case CREATE_STALL
          case GET_STALL
          case UPDATE_STALL
          case DELETE_STALL

          /* POSTS */
          case CREATE_POST
          case GET_POST
          case UPDATE_POST
          case DELETE_POST

          case ADD_RESERVATION
          case REMOVE_RESERVATION

          case AUTHENTICATE
}


public class Message<T: Decodable> : Decodable {

    var type: MessageType?
    var model : T?
    init(type:MessageType,model:T) {
        self.type = type
        self.model = model
    }

}

马模型

  let id: Int?
     let name: String?
     let race: String?
     let lifeNumber : String?
     let chipNumber : String?
     let birthDate : Date?
     let gender : Gender?
     let medicalReports : [MedicalReport]?
     let owners : [User]?


 init (id:Int, name:String,race:String,lifeNumber: String, chipNumber:String, birthDate : Date, gender:Gender, medicalReports: [MedicalReport] , owners : [User]) {

      self.id = id
      self.name = name
      self.race = race
      self.lifeNumber = lifeNumber
      self.chipNumber = chipNumber
      self.birthDate = birthDate
      self.gender = gender


      self.medicalReports = medicalReports
      self.owners = owners

  }

这是我的JSON响应:

{"type":"GET_HORSE","model":{"id":1,"name":"Horse2","race":"Race2","lifeNumber":"lifenumber2","chipNumber":"chipnumber2","birthDate":1579182813067,"gender":"MALE","medicalReports":[],"owners":[]}}

这里是代码

func getJSON (completion: @escaping (Message<Horse>)->()) {
        let url = "http://localhost:8083/horse/1"
    if let url = URL(string: url)
    {
        let task = session.dataTask(with: url) { data, response, error in

                  if error != nil || data == nil {
                      print("Client error!")
                      return
                  }
            let str = String(decoding: data!, as: UTF8.self)
            print(str)
                  do {
                   let decoder = JSONDecoder()
                   print("nothing")

                    if let json = try? decoder.decode(Message<Horse>.self, from: data!) {
                       print(json)
                       print("something")
                   }

                  } catch {
                      print("JSON error: \(error.localizedDescription)")
                  }
              }

              task.resume()
        print("finished")
    }
swift api
1个回答
1
投票

根据您的JSON-"type":"GET_HORSE"-您应将enum MessageType : Int,Decodable更改为enum MessageType: String, Decodable。更改为String后,我已经检查了您的代码,并在此处找到了正确的型号

if let json = try? decoder.decode(Message<Horse>.self, from: data!) {
    print(json)
    print("something")
}

但不是json,它是Message<Horse>类型的模型>

© www.soinside.com 2019 - 2024. All rights reserved.