Как указать несколько типов для декодирования в перечислении CodingKeys при использовании Codable? - PullRequest
0 голосов
/ 14 мая 2019

У меня есть тип struct, в котором перечислены различные типы, которые должны быть декодированы из JSON, и я не могу найти никакой информации о том, как указать более одного типа в моем enum с именем CodingKeys.В самом внутреннем словаре иногда одна пара ключ: значение будет [String:String], а другая пара ключ: значение будет [String:Int]

Я попытался указать только String и CodingKey, как в фрагменте кода нижено XCode сообщает о 2 сообщениях об ошибках.

struct JSONSiteData : Codable {
    let destinationAddresses : [String]
    let originAddresses : [String]
    let rows : [    [String : [[String:[[String: [String:Any]]]]]]      ]
    let status : String
}

enum CodingKeys : String, CodingKey {
    case destinationAddresses = "destination_addresses"
    case originAddresses = "origin_addresses"
    case rows
    case status
}

Я получаю следующие сообщения об ошибках от XCode;

Type 'JSONSiteData' does not conform to protocol 'Decodable'
Type 'JSONSiteData' does not conform to protocol 'Encodable'

Вот мой JSON;

{
    "destination_addresses": [
        "1 Dunwell Ln, Bolam, Darlington DL2 2UW, UK",
        "Unnamed Road, Newton Aycliffe DL5 6QZ, UK",
        "Preston Manor Farm, Preston le Skerne, Newton Aycliffe DL5 6JH, United Kingdom",
        "6 Middridge Farms, Middridge, Newton Aycliffe DL5 7JQ, UK",
        "1 The Gardens, Hunwick, Crook DL15 0XW, UK"
    ],
    "origin_addresses": [
        "42 Drovers Way, Dunstable LU6 1AW, UK"
    ],
    "rows": [
        {
            "elements": [
                {
                    "distance": {
                        "text": "220 mi",
                        "value": 353731
                    },
                    "duration": {
                        "text": "3 hours 45 mins",
                        "value": 13475
                    },
                    "status": "OK"
                },
                {
                    "distance": {
                        "text": "222 mi",
                        "value": 356696
                    },
                    "duration": {
                        "text": "3 hours 45 mins",
                        "value": 13471
                    },
                    "status": "OK"
                },
                {
                    "distance": {
                        "text": "222 mi",
                        "value": 358053
                    },
                    "duration": {
                        "text": "3 hours 46 mins",
                        "value": 13545
                    },
                    "status": "OK"
                },
                {
                    "distance": {
                        "text": "225 mi",
                        "value": 361421
                    },
                    "duration": {
                        "text": "3 hours 49 mins",
                        "value": 13768
                    },
                    "status": "OK"
                },
                {
                    "distance": {
                        "text": "229 mi",
                        "value": 369280
                    },
                    "duration": {
                        "text": "3 hours 57 mins",
                        "value": 14238
                    },
                    "status": "OK"
                }
            ]
        }
    ],
    "status": "OK"
}

Ответы [ 2 ]

0 голосов
/ 14 мая 2019

Вы можете попробовать это,

// To parse the JSON, add this file to your project and do:
//
//   let jsonSiteData = try? newJSONDecoder().decode(JSONSiteData.self, from: jsonData)

import Foundation

struct JSONSiteData: Codable {
    let destinationAddresses, originAddresses: [String]
    let rows: [Row]
    let status: String

    enum CodingKeys: String, CodingKey {
        case destinationAddresses = "destination_addresses"
        case originAddresses = "origin_addresses"
        case rows, status
    }
}

struct Row: Codable {
    let elements: [Element]
}

struct Element: Codable {
    let distance, duration: Distance
    let status: String
}

struct Distance: Codable {
    let text: String
    let value: Int
}

Перейдите по этой ссылке для создания моделей из строк JSON. https://app.quicktype.io/

0 голосов
/ 14 мая 2019

В терминах Codable нет различных типов.

Расшифруйте эти структуры

struct JSONSiteData : Decodable {
    let destinationAddresses : [String]
    let originAddresses : [String]
    let rows : [Row]
    let status : String
}

struct Row : Decodable {
    let elements : [Element]
}

struct Element : Decodable {
    let distance : Item
    let duration : Item
    let status : String
}

struct Item : Decodable {
    let text : String
    let value : Int
}
...