使用GSON对枚举进行自定义反序列化

时间:2013-07-18 07:46:13

标签: 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中的一个可能值是“default”,这不是有效的枚举值。此外,我希望没有小写名称的枚举值。这基本上意味着我需要定制GSON解析。有人可以帮我吗?

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

1 个答案:

答案 0 :(得分:3)

如果要为枚举进行自定义解析,则需要注册适配器

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();

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