2017-07-25 64 views
0

解析枚举我有这样一个类:问题,同时使用GSON

@JsonInclude(Include.NON_NULL) 
@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class) 
public class VPC 
{ 
    @NotNull() 
    private String id; 

    @NotNull() 
    @DynamoDBMarshalling(marshallerClass = SubnetTypeMarshaller.class) 
    private Map<SubnetType, List<String>> subnetTypeToId; 
} 

这里,SubnetType是这样的枚举:

public enum SubnetType 
{ 

    AppSubnet, 

    DBSubnet, 

    DMZSubnet; 
} 

现在,我想存储在AWS DynamoDB以上。为此,我需要将enum转换为一个字符串,并且我写了以下内容。

public class SubnetTypeMarshaller implements DynamoDBMarshaller<Map<SubnetType, List<String>>> 
{ 

    private Gson gson = new GsonBuilder().create(); 

    @Override 
    public String marshall(final Map<SubnetType, List<String>> securityGroupTypeListMap) 
    { 
     return gson.toJson(securityGroupTypeListMap); 
    } 

    @Override 
    public Map<SubnetType, List<String>> unmarshall(final Class<Map<SubnetType, List<String>>> aClass, 
      final String s) 
    { 
     return gson.fromJson(s, aClass); 
    } 
} 

但这不起作用。从数据库中获取值时,出现以下错误:

java.lang.String cannot be cast to java.lang.Enum (through reference chain: java.util.ArrayList[0]->["security_group_type_to_id"])

我是否缺少这方面的内容?我在其他帖子上搜索如何使用@SerializedName注释将枚举转换为字符串。但是那也行不通。我也尝试了另一篇文章中提到的解决方案,但它不起作用。也许是因为我的枚举本身是地图的一部分,我不能真正注释地图内的枚举属性。

+0

[序列化和反序列化与枚举的枚举]的可能重复](https://stackoverflow.com/questions/16740078/serialize-and-deserialize-enum-with-gson) – Tschallacka

+0

@Tschallacka,我的问题是不同的。我已经在其他文章中提到过了。 – sarah

回答

0

Gson为枚举提供了默认序列化,如果你想改变它,你必须建立自己的适配器。

检查gson docs的registerTypeAdapter。