java - 使用 GSON 自定义枚举反序列化

标签 java enums customization deserialization gson

我需要制作以下 json:

[ { "contentType": "folder" },
  { "contentType": "image" },
  { "contentType": "video" }
]

解析这样的数组:

FileStructureElement [] elements[];

拥有:

public class FileStructureElement {
    private ElementType contentType;
}

public enum ElementType {
    FOLDER, IMAGE, VIDEO, DEFAULT;
}

这是简化的示例,FileStructureElement 类具有更多属性,与问题字段无关。

我想将 contentType 属性的值加载为 ElementType 的值。我无法让枚举的值与 json 的类型匹配,因为 json 中的可能值之一是“默认”,这不是有效的枚举值。此外,我不希望枚举值带有小写名称。这基本上意味着我需要定制 GSON 解析。有人可以帮我吗?

想法来自here (检查我解析的属性的值并选择是否加载枚举值)对我没有帮助,因为我无法控制我与之交谈的 Web 服务接口(interface),并且这些值太明显,我冒着它们的风险还将作为其他一些 json 属性的值出现。

最佳答案

如果你想对枚举进行自定义解析,则需要注册一个适配器

JsonDeserializer<?> jd = new JsonDeserializer<ElementType>() {
  @Override
  public ElementType deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
    String enumStr = json.getAsString();
    ElementType val = 
    //...

    return val;
  }
};

Gson gson = new GsonBuilder().registerTypeAdapter(ElementType.class, jd).create();

只需返回所提供字符串的正确枚举值即可。

关于java - 使用 GSON 自定义枚举反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17717582/

相关文章:

java - UML 类图关系

java.io.StreamCorruptedException : invalid type code: 3F when I customize serialization process

delphi - 如何自定义测试用例向导生成的 DUnit 测试用例类?

ruby-on-rails - 在Devise中自定义空白错误

java - 查找数组中的非重复元素

java - Android 在一个 Activity 上只运行一次类

java - 如何编译和运行包中的类,该类从另一个包中的另一个类继承 protected 成员

c# - 在 C# 中将枚举列表转换为标志

java - 枚举类型引用或原始类型(带有示例)- 浅/深复制

java - 如何在java中重构这个Enum