Переопределить только несколько ключей JSON, используя перечисление 'CodingKeys' - PullRequest
0 голосов
/ 06 ноября 2019

Я анализирую данные JSON, используя Codables. Проблема в том, что мои несколько ключей кодирования отличаются от имен переменных. Для этого я использовал CodingKeys enum, что довольно прямолинейно, однако тогда я должен написать все ключи, я этого не хочу. Я только хочу переопределить несколько ключей, а не все.

вот JSON

{
   "string_one" = "some string",
   "string_two" = "some string",
   "string_three_%s" = "some string",
}
class Strings: Codable{

    var string_one: String?
    var string_two: String?
    var string_three: String?

    enum CodingKeys: String, CodingKey {
        case string_three = "string_three_%s"
    }
}

Подробнее Объяснение

я знаю, что добавление case string_one, string_two будет работать, но, скажем, у меня есть 1000 строк, и я хочу переопределить только одну, я должен написать 999 случаев без какой-либо причины. Мне это не кажется разумным (писать 999 дел без всякой причины)

Ответы [ 5 ]

0 голосов
/ 11 ноября 2019

Просто предложение (не проверено), но не могли бы вы использовать базовый класс (который расширяет Codable) с полями, которые вы не хотите переопределять, а затем использовать подкласс, в котором есть только имена, которые нужно переопределить? Т.е. CodingKeys требует от вас определения значений для унаследованных полей?

0 голосов
/ 06 ноября 2019

Вы должны установить все ключи кодирования, чтобы работать на данный момент.

Класс будет только кодировать / декодировать, ключи, которые вы описали в enum CodingKeys.

Если выиметь большее количество строк, я бы посоветовал вам связаться с командой сервера для создания массива строк ([String]) вместо этого шаблона.


Обновление: поскольку у вас большое количество значенийВы должны были пойти на [String]

0 голосов
/ 06 ноября 2019

Короче говоря, вы не можете этого сделать. Это может быть сделано только путем помещения всех дел, как показано ниже: -

enum CodingKeys: String, CodingKey {
        case string_one, string_two
        case string_three = "string_three_%s"
    }

Ключи string_one и string_two будут выбраны как

0 голосов
/ 06 ноября 2019

Проверьте эту правильную форму модального класса. Надеюсь, вы получите свое решение

struct Welcome: Codable {
    let stringOne, stringTwo, stringThreeS: String?

    enum CodingKeys: String, CodingKey {
        case stringOne = "string_one"
        case stringTwo = "string_two"
        case stringThreeS = "string_three_%s"
    }
}
0 голосов
/ 06 ноября 2019

На данный момент это невозможно. Вы должны указать все cases в CodingKeys.

Просто для других вам не нужно явно указывать rawValue, поскольку enum CodingKeys имеет необработанный тип как String и выберет имя case в качестве значения по умолчанию rawValue, т.е.

enum CodingKeys: String, CodingKey {
    case string_three = "string_three_%s"
    case string_one, string_two
}
...