Быстрое хранение данных из веб-запроса в структуры - PullRequest
0 голосов
/ 18 февраля 2019

Прежде всего, я действительно новичок в Swift.Я застрял на несколько часов в этом.

Вот проблема, я использую AlamoFire для того, чтобы сделать мой запрос

func getListFiles(userId: String, page: Int)
{
    let parameters: Parameters = [
        "userId": userId,
        "page": page
    ]

    Alamofire.request(baseUrl + Endpoints.GET_RECORDS.rawValue, method: HTTPMethod.post, parameters: parameters)
        .responseData { response in
            if let result = response.result.value{
                do {
                    let data = try JSONDecoder().decode(ListFilesStruct.self, from: result)
                } catch {
                    print("\(error)")
                }
            }
    }
}

, и я хочу сохранить ответ данных в моей структуре"ListFilesStruct".Но он входит в «catch» и завершается с ошибкой

Printing description of error:
▿ DecodingError
  ▿ typeMismatch : 2 elements
- .0 : Swift.Dictionary<Swift.String, Any>
▿ .1 : Context
  ▿ codingPath : 3 elements
    - 0 : CodingKeys(stringValue: "data", intValue: nil)
    ▿ 1 : _JSONKey(stringValue: "Index 6", intValue: 6)
      - stringValue : "Index 6"
      ▿ intValue : Optional<Int>
        - some : 6
    - 2 : CodingKeys(stringValue: "expert", intValue: nil)
  - debugDescription : "Expected to decode Dictionary<String, Any> but found a string/data instead."
  - underlyingError : nil

Вот основная структура, я хочу массив FileDetail

struct ListFilesStruct: Codable
{
    var success: Bool?
    var data: [FileDetail]?
}

struct FileDetail: Codable
{
    var id: String?
    var expert: FileElement?
}

И он точно дает сбой из-за структуры FileElement, яне знаю, почему

struct FileElement: Codable
{
    var id: String?
    var role_id: String?
    var avatar: String?
    var nom: String?
    var prenom: String?  
}

Я действительно хочу хранить данные Webservice, спасибо

РЕДАКТИРОВАТЬ: Ожидаемый JSON:

{
"success": true,
"data": [
    {
        "id": "A19007994",
        "expert": {
            "id": "74EJEEZM",
            "role_id": "EXPERT",
            "avatar": null,
            "nom": "METRTALZ",
            "prenom": "JEREMIE",
        }
     }
 ]
 }

1 Ответ

0 голосов
/ 18 февраля 2019

Используйте приведенную ниже структуру для ожидаемого json

class MyCustomJSON: Codable {
    let success: Bool
    let data: [Datum]

    enum CodingKeys: String, CodingKey {
        case success = "success"
        case data = "data"
    }

    init(success: Bool, data: [Datum]) {
        self.success = success
        self.data = data
    }
}

class Datum: Codable {
    let id: String
    let expert: Expert

    enum CodingKeys: String, CodingKey {
        case id = "id"
        case expert = "expert"
    }

    init(id: String, expert: Expert) {
        self.id = id
        self.expert = expert
    }
}

class Expert: Codable {
    let id: String
    let roleID: String
    let nom: String
    let prenom: String

    enum CodingKeys: String, CodingKey {
        case id = "id"
        case roleID = "role_id"
        case nom = "nom"
        case prenom = "prenom"
    }

    init(id: String, roleID: String, nom: String, prenom: String) {
        self.id = id
        self.roleID = roleID
        self.nom = nom
        self.prenom = prenom
    }
}

// MARK: Encode/decode helpers

class JSONNull: Codable, Hashable {

    public static func == (lhs: JSONNull, rhs: JSONNull) -> Bool {
        return true
    }

    public var hashValue: Int {
        return 0
    }

    public init() {}

    public required init(from decoder: Decoder) throws {
        let container = try decoder.singleValueContainer()
        if !container.decodeNil() {
            throw DecodingError.typeMismatch(JSONNull.self, DecodingError.Context(codingPath: decoder.codingPath, debugDescription: "Wrong type for JSONNull"))
        }
    }

    public func encode(to encoder: Encoder) throws {
        var container = encoder.singleValueContainer()
        try container.encodeNil()
    }
}

и инициализируйте следующим образом

do {
     let myCustomJSON = try JSONDecoder().decode(MyCustomJSON.self, from: jsonData)
} catch {
  print("\(error)")
}

Я попробовал свой код на игровой площадке, и все работает.enter image description here

...