使用gson

时间:2017-07-25 12:08:08

标签: java enums 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中。为此,我需要将枚举转换为字符串,我写了以下内容。

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

但这不起作用。从DB获取值时,我收到以下错误:

  

java.lang.String无法强制转换为java.lang.Enum(通过引用链:java.util.ArrayList [0] - &gt; [“security_group_type_to_id”])

我错过了什么吗?我在其他帖子中搜索了如何使用@SerializedName注释将枚举转换为字符串。但这也不起作用。我也尝试过其他帖子中提到的解决方案,但它不起作用。也许是因为我的枚举本身就是地图的一部分,我无法真正注释地图中的枚举属性。

1 个答案:

答案 0 :(得分:0)

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

检查gson docs是否有registerTypeAdapter。