使用枚举的值与 Gson 序列化
Using a value of the enum to serialize with Gson
我为 Java 项目创建了两个枚举,它们都需要使用 Gson 进行序列化和反序列化。问题是,我需要在每个枚举字段上使用一个值作为序列化值。
例如,我有这些枚举:
我希望我能够使用提供给两者的 key
值来序列化这两个枚举。这是一个非常简单的例子,但它仍然完美地描述了我的情况。
我尝试为两者使用自定义序列化器 classes:
是的,我确实使用 registerTypeAdapter(type, adapter)
注册了两者
奇怪的是,它适用于一个枚举,序列化为正确的值,但不适用于另一个。我怀疑这是因为正在序列化的 class 的格式类似于:
public class Item {
public Language language;
public List<Options> options;
}
在这种情况下,Language
被正确序列化,但 Options
枚举没有,只是返回枚举值名称。
我不确定我是否需要一些特殊的方法来处理这个问题,但它越来越令人沮丧。
编辑:我知道使用 @SerializedName()
注释,但我使用的两个枚举都有数百个条目和键枚举也在整个程序的其他地方使用。使用 @SerializedName()
,至少在我的情况下,我认为不可行。
为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()));
}
}
我为 Java 项目创建了两个枚举,它们都需要使用 Gson 进行序列化和反序列化。问题是,我需要在每个枚举字段上使用一个值作为序列化值。
例如,我有这些枚举:
我希望我能够使用提供给两者的 key
值来序列化这两个枚举。这是一个非常简单的例子,但它仍然完美地描述了我的情况。
我尝试为两者使用自定义序列化器 classes:
是的,我确实使用 registerTypeAdapter(type, adapter)
奇怪的是,它适用于一个枚举,序列化为正确的值,但不适用于另一个。我怀疑这是因为正在序列化的 class 的格式类似于:
public class Item {
public Language language;
public List<Options> options;
}
在这种情况下,Language
被正确序列化,但 Options
枚举没有,只是返回枚举值名称。
我不确定我是否需要一些特殊的方法来处理这个问题,但它越来越令人沮丧。
编辑:我知道使用 @SerializedName()
注释,但我使用的两个枚举都有数百个条目和键枚举也在整个程序的其他地方使用。使用 @SerializedName()
,至少在我的情况下,我认为不可行。
为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()));
}
}