如何改变java枚举的初始值_java – 更改gson中的默认枚举序列化和反序列化

我正在以一种略微“不同”的方式使用Gson,我想知道以下是否可行……

我想更改枚举的默认序列化/反序列化格式,以便它使用完全限定的类名,但在所述枚举上保持对@SerializedName注释的支持.基本上,鉴于以下枚举…

package com.example;

public class MyClass {

public enum MyEnum {

OPTION_ONE,

OPTION_TWO,

@SerializedName("someSpecialName")

OPTION_THREE

}

}

我想以下是真实的……

gson.toJson(MyEnum.OPTION_ONE) == "com.example.MyClass.MyEnum.OPTION_ONE"

&&

gson.toJson(MyEnum.OPTION_TWO) == "com.example.MyClass.MyEnum.OPTION_TWO"

&&

gson.toJson(MyEnum.OPTION_THREE) == "someSpecialName"

反之亦然.

(对于那些好奇的人,我正在尝试构建一个小的lib,允许我将android的intent的动作视为枚举,这样我就可以编写switch语句而不是一堆丑陋的if-elses字符串比较,我想支持注释,以便我也可以在同一个枚举中包含自定义的预先存在的动作字符串,如Intent.ACTION_VIEW等.

那么有人会知道是否可以注册一个类型适配器,如果@SerializedName字段存在,它可以回退?我是否只需要在自己的TypeAdapter中检查该注释?

提前致谢.

解决方法:

我为这个问题创建了非常好的解决方案:

package your.package.name

import com.google.gson.Gson;

import com.google.gson.TypeAdapter;

import com.google.gson.TypeAdapterFactory;

import com.google.gson.reflect.TypeToken;

import com.google.gson.stream.JsonReader;

import com.google.gson.stream.JsonWriter;

import java.io.IOException;

import java.lang.reflect.Field;

public class EnumAdapterFactory implements TypeAdapterFactory {

@Override

public TypeAdapter create(final Gson gson, final TypeToken type) {

Class super T> rawType = type.getRawType();

if (rawType.isEnum()) {

return new EnumTypeAdapter();

}

return null;

}

public class EnumTypeAdapter extends TypeAdapter {

public void write(JsonWriter out, T value) throws IOException {

if (value == null) {

out.nullValue();

return;

}

Enum> realEnums = Enum.valueOf(value.getClass().asSubclass(Enum.class), value.toString());

Field[] enumFields = realEnums.getClass().getDeclaredFields();

out.beginObject();

out.name("name");

out.value(realEnums.name());

for (Field enumField : enumFields) {

if (enumField.isEnumConstant() || enumField.getName().equals("$VALUES")) {

continue;

}

enumField.setAccessible(true);

try {

out.name(enumField.getName());

out.value(enumField.get(realEnums).toString());

} catch (Throwable th) {

out.value("");

}

}

out.endObject();

}

public T read(JsonReader in) throws IOException {

return null;

}

}

}

而且当然 :

new GsonBuilder().registerTypeAdapterFactory(new EnumAdapterFactory()).create();

希望这可以帮助 !

标签:java,enums,serialization,gson

来源: https://codeday.me/bug/20190528/1173711.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值