Использование значения перечисления для сериализации с помощью Gson - PullRequest
0 голосов
/ 08 июля 2020

У меня есть два перечисления, которые я создал для своего проекта Java, и оба из них необходимо сериализовать и десериализовать с помощью Gson. Проблема в том, что мне нужно использовать значение в каждом поле перечисления в качестве сериализованного значения.

В качестве примера у меня есть следующие перечисления:

Параметры Enum

Language Enum

Я надеюсь, что я смогу сериализовать оба перечисления, используя значение key, предоставленное обоим. Это действительно упрощенный пример, но он по-прежнему прекрасно описывает мою ситуацию.

Я пробовал использовать собственные классы сериализатора для обоих:

Сериализатор параметров

Сериализатор языка

И да, я зарегистрировал оба, используя registerTypeAdapter(type, adapter)

Как ни странно, он работал бы для одного перечисления, сериализуясь до правильного значения, но не другой. Я подозреваю, что это потому, что сериализуемый класс форматируется примерно так:

public class Item {
    public Language language;
    public List<Options> options;
}

Где в этом случае Language сериализуется правильно, а Options enum нет, просто возвращает значение перечисления name.

Я не уверен, что мне нужен какой-то особый способ справиться с этим, но это меня расстраивает.

EDIT : Я знаю об использовании @SerializedName() аннотация, но оба перечисления, которые я использую, содержат сотни записей, и ключи, которые являются частью перечисления, также используются в других местах программы. Использование @SerializedName(), по крайней мере, в моем случае, я не думаю, что это возможно.

1 Ответ

0 голосов
/ 08 июля 2020

Напишите адаптер для Item. Я бы добавил еще но ноут на 1%.

    static class ItemAdapter extends TypeAdapter<Item> {

        @Override
        public void write(JsonWriter out, Item value) throws IOException {
            out.beginObject();
            out.name("language").value(value.language.key);
            out.name("options");
            out.beginArray();
            for (Option option : value.options) {
                out.value(option.key);
            }
            out.endArray();
            out.endObject();
        }

        @Override
        public Item read(JsonReader in) throws IOException {
            in.beginObject();

            in.nextName();
            String languageKey = in.nextString();

            in.nextName();
            in.beginArray();

            List<String> optionKeys = new ArrayList<>();

            while (in.hasNext()) {
                optionKeys.add(in.nextString());
            }
            in.endArray();

            in.endObject();

            return new Item(Language.BY_KEY.get(languageKey),
                    optionKeys.stream()
                            .map(Option.BY_KEY::get)
                            .collect(Collectors.toList()));
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...