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

Java 使用GSON自定义枚举反序列化,java,enums,customization,deserialization,gson,Java,Enums,Customization,Deserialization,Gson,我需要制作以下json: [ { "contentType": "folder" }, { "contentType": "image" }, { "contentType": "video" } ] 在这样的数组中解析: FileStructureElement [] elements[]; 具有: public class FileStructureElement { private ElementType contentType; } public enum Elem

我需要制作以下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解析。有人能帮我吗


检查我解析的属性的值并选择是否加载枚举值,这对我没有帮助,因为我无法控制与之交谈的web服务接口,而且这些值太明显,我有可能它们也会作为其他一些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();

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

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

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

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

您应该为类指定definition@user1488644谢谢你的建设性评论。我进一步简化并修改了我的问题。希望你现在能帮助我。你应该给我上课definition@user1488644谢谢你的建设性评论。我进一步简化并修改了我的问题。希望你现在能帮助我。