Что если имя не указано в значении случайного ключа? Как вы можете захватить значение ключа, чтобы назначить его в качестве имени собаки?

я проблемы с декодированием JSON. Я следовал многим учебникам, но не использовал сложные структуры json. Для простоты я свернул код и использую Dog в качестве примера.

В следующем json меня больше всего интересуют только структуры Dog.Атрибут json «Данные» содержит случайные имена собак, Поэтому я не могу использовать ключи кодирования, потому что я не знаю имени атрибута.

{
     "Response": "success"
     "BaseLinkUrl": "https://wwww.example.com",
     "Data": {
         "Max": {
             "name": "Max",
             "breed": "Labrador"
         },
         "Rocky": {
             "name": "Rocky",
             "breed": "Labrador"
         },
         ...
    }
}

У меня есть следующие структуры:

struct DogResponse : Decodable {
    let data : DogResponseData

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

struct DogResponseData: Decodable {
    let dog: Dog //this is a random variable name

    enum CodingKeys: String, CodingKey {
        case dog = "??random_variable_dog_name??"
    }
}

struct Dog: Decodable {
    let name: String
    let type: String

    enum CodingKeys: String, CodingKey {
        case name
        case type = "breed"
    }
}

Собирая собачьи строения:

let dogResponse = try JSONDecoder().decode(DogResponse.self, from: data)
print(dogResponse)

Что мне нужно сделать в моей структуре "DogResponseData", чтобы swift распознал случайную переменную, которая содержит мою структуру Dog?

Ответы на вопрос(1)

Решение Вопроса

ия словарей как[String:Dog] и отобразить значения в массив

struct Dog : Decodable {
    let name : String
    let breed : String
}

struct DogResponse : Decodable {
    let dogs : [Dog]

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

    init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        let data = try values.decode([String : Dog].self, forKey: .data)
        dogs = Array(data.values)
    }
}
let dogResponse = try JSONDecoder().decode(DogResponse.self, from: data)
print(dogResponse.dogs)

================================================== =========================

Или, если вы хотите сохранить структуру словаря, она еще короче

struct Dog : Decodable {
    let name : String
    let breed : String
}

struct DogResponse : Decodable {
    let dogs : [String : Dog]

    private enum CodingKeys: String, CodingKey {
        case dogs = "Data"
    }
}
 control-panel02 дек. 2017 г., 13:07
Спасибо! Оба варианта работают как шарм! Теперь я вижу, что мне даже не приходилось иметь дело со случайным ключом.
 vikzilla10 мая 2018 г., 00:14
Что если имя не указано в значении случайного ключа? Как вы можете захватить значение ключа, чтобы назначить его в качестве имени собаки?
 vadian02 дек. 2017 г., 13:58
Поскольку случайный ключ всегда равенname это избыточно.

Ваш ответ на вопрос