2017-07-25 4 views
0

J'ai une classe comme ceci:problèmes lors de l'analyse énumérations à l'aide 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; 
} 

Ici, SubnetType est un ENUM comme ceci:

public enum SubnetType 
{ 

    AppSubnet, 

    DBSubnet, 

    DMZSubnet; 
} 

Maintenant, je veux stocker ci-dessus dans AWS DynamoDB . Pour cela, j'ai besoin de convertir enum en une chaîne et j'ai écrit ce qui suit.

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

Mais cela ne fonctionne pas. Tout en obtenant des valeurs de DB, j'obtiens l'erreur suivante:

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

Est-ce que je manque quelque chose dans ceci? J'ai cherché sur d'autres publications comment convertir enums en chaîne en utilisant @SerializedName annotation. Mais cela n'a pas fonctionné non plus. J'ai également essayé la solution mentionnée dans l'autre article, mais cela ne fonctionne pas. Peut-être parce que mon énumération fait partie de la carte et que je ne peux pas vraiment annoter l'attribut enum à l'intérieur de la carte.

+0

Copie possible de [serialize et deserialize enum avec Gson] (https://stackoverflow.com/questions/16740078/serialize-and-deserialize-enum-with-gson) – Tschallacka

+0

@Tschallacka, ma question est différente. J'ai déjà ce qui est mentionné dans l'autre post. – sarah

Répondre

0

Gson fournit la sérialisation par défaut pour les énumérations, si vous souhaitez le modifier, vous devez créer votre propre adaptateur.

Vérifiez gson docs pour registerTypeAdapter.