eConti - программирование в вопросах и ответах

Переопределить только несколько ключей JSON с помощью перечисления CodingKeys

Я анализирую данные 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 дел без всякого повода)

06.11.2019

Ответы:


1

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

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

enum CodingKeys: String, CodingKey {
    case string_three = "string_three_%s"
    case string_one, string_two
}
06.11.2019
  • скажем, у меня есть 1000 строк и я хочу переопределить только одну, мне нужно написать 999 случаев без какой-либо причины. Мне это не кажется разумным (писать 999 дел без всякого повода). 06.11.2019
  • Вот как Codable разрабатывается Apple на данный момент. Тебе придется принять эту боль .. :) 06.11.2019
  • Что ж, я добавил больше пояснений к своему вопросу, чтобы другие люди не тратили время на добавление ответов на него. Спасибо, в любом случае. 06.11.2019
  • Конечно. Но в любом случае вы не можете этого сделать. Codable этого не допускает. 06.11.2019

  • 2

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

    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"
        }
    }
    
    06.11.2019
  • оценил, но я вопрос другой. пожалуйста, прочтите еще раз ... 06.11.2019

  • 3

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

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

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


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

    06.11.2019
  • не может этого сделать, так как данные конфигурации извлекаются при запуске приложения ... и мы не можем использовать их по индексу. Однако сохранение словаря как есть может быть решением. 06.11.2019
  • Ага. Или вам нужно указать все ключи. 06.11.2019
  • Можем ли мы пойти по наследству здесь. как непереопределяемые строки в родительском классе и переопределяемые в дочернем классе. просто случайная идея ... @ lal-krishna 06.11.2019

  • 4

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

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

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

    06.11.2019
  • То же, что и выше ... но не мое решение, скажем, у меня 1000 строк и я хочу переопределить только одну, мне нужно написать 999 случаев без какой-либо причины. Мне это не кажется разумным (писать 999 дел без всякого повода) 06.11.2019
  • @ChaudharyShahbazSaleem Ключи кодирования работают так же, как указано выше. Варианта нет. Короче говоря, вы не можете этого сделать. 06.11.2019
  • @AdityaSrivastava Пожалуйста, не добавляйте повторяющиеся ответы. 06.11.2019
  • @PGDev Не копировал ваш простой ответ, может быть добавлен одновременно. 06.11.2019

  • 5

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

    11.11.2019
  • Я пробовал это, но CodingKeys работает только для дочернего класса. Он не анализирует родительские ключи. 11.11.2019
  • Новые материалы

    ИИ для общего блага, часть вторая
    В нашем последнем блоге мы исследовали возможности ИИ для общего блага, указав на несколько инициатив по поиску действенных решений для продвижения справедливых и беспристрастных систем ИИ. По..

    Время расцвета закончилось
    Большую часть своей карьеры в индустрии программного обеспечения программисты работали с головой в песок. Успех в отрасли требует навыков презентации и обучения других. Ценность улучшенных..

    Будущее сельского хозяйства: новый уровень производительности с современными технологиями
    По мере роста населения мира растет и спрос на продукты питания. Фермеры сталкиваются с растущим давлением необходимости повышать урожайность и максимизировать производительность, манипулируя..

    Состояние совместной фильтрации в 2022 году, часть 1
    ResBeMF: Улучшение прогнозируемого охвата совместной фильтрации на основе классификации (arXiv) Автор: Анхель Гонсалес-Прието , Авраам Гутьеррес , Фернандо Ортега , Рауль Лара-Кабрера..

    Зачем изучать PYTHON в 2022 году !
    Python — востребованный, доступный язык программирования с активным, постоянно растущим сообществом пользователей. Для тех, кто хочет сменить профессию в мире технологий с помощью..

    Решение капч с помощью Puppeteer
    Это руководство предназначено для текстовых кодов, а не для reCAPTCHA Google (см. конец этого сообщения). Требования: Антикапча или любой другой сервис по разгадыванию капчи. Модуль..

    7 встроенных библиотек Python, которые необходимо знать
    7 встроенных библиотек Python, которые необходимо знать Стандартная библиотека Python значительно упрощает жизнь программистов, предоставляя широкий набор функций. Мы выбираем несколько..