У меня есть ответ api в следующей форме -
{
"textEntries":{
"summary":{
"id":"101e9136-efd9-469e-9848-132023d51fb1",
"text":"some text",
"locale":"en_GB"
},
"body":{
"id":"3692b0ec-5b92-4ab1-bc25-7711499901c5",
"text":"some other text",
"locale":"en_GB"
},
"title":{
"id":"45595d27-7e06-491e-890b-f50a5af1cdfe",
"text":"some more text again",
"locale":"en_GB"
}
}
}
Я хотел бы декодировать это через JSONDecoder
, чтобы использовать свойства. У меня есть проблема с ключами, в данном случае _3 _, _ 4_ и title
генерируются где-то еще, а не всегда эти значения, они всегда уникальны, но основаны на логике, которая имеет место в другом месте продукта, так что другой вызов статьи с другим содержанием может вернуть leftBody
или subTitle
и т. д.
Модель для тела этих реквизитов всегда одна и та же, однако я могу ожидать, что одни и те же поля будут существовать в любой комбинации ответов.
Мне нужно будет иметь доступ к телу каждого ключа в коде где-нибудь еще. Другой ответ API скажет мне ключ, который мне нужен.
Я не уверен, как я могу справиться с этим с помощью Decodable
, поскольку я не могу ввести значения заранее.
Я думал о моделировании тела -
struct ContentArticleTextEntries: Decodable {
var id: String
var text: String
var locale: Locale
}
и сохранение значений в структуре вроде -
struct ContentArticle: Decodable {
var textEntries: [String: ContentArticleTextEntries]
private enum CodingKeys: String, CodingKey {
case textEntries
}
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
self.textEntries = try values.decode(ContentArticleTextEntries.self, forKey: .textEntries)
}
}
Я мог бы использовать индекс в другом месте для доступа к свойству, однако я не знаю, как декодировать в эту форму, поскольку приведенное выше не сработает.
Так что позже я, например, получу доступ к textEntries["body"]
.
Я также не знаю, есть ли лучший способ справиться с этим.
Я думал о преобразовании ключей в «тип» с помощью перечисления, но опять же, незнание случаев перечисления заранее делает это невозможным.
Я знаю, что textEntries не меняется, и я знаю, что идентификатор, текст и языковой стандарт не меняются. Я не знаю ключей между этим слоем. Я пробовал полезное решение, опубликованное @vadian, но, похоже, не могу выполнить эту работу в контексте того, что нужно декодировать только 1 набор ключей.
textEntries
с помощью ключа, который я могу получить откуда-нибудь. например, как только я получу эти значения, другой ответ может потребовать от меня поискаbody
и т. д. - person Teddy K   schedule 20.11.2019let nestedValues = try decoder.nestedContainer(keyedBy: NestedCodingKeys.self, forKey: .WhatEverYourKeyIs)
- person Jafar Khoshtabiat   schedule 20.11.2019textEntries
? Это всегда одно и то же? И дочерние элементы тоже имеют такую же форму? Значит, в этом случае вы не знаете, какими будут ключи, представленныеbody
,summary
и т. Д.? - person nodediggity   schedule 21.11.2019textEntries
это не изменится, и я знаюid
,text
иlocale
, это не изменится. Я не знаю ключей между этим слоем. Я пробовал полезное решение, опубликованное @vadian, но, похоже, не могу выполнить эту работу в контексте того, что нужно декодировать только 1 набор ключей. - person Teddy K   schedule 21.11.2019