Estou usando o Jackson Marshaller para gerar XML e JSON a partir de um objeto, mas a serialização JSON de valores enum sempre acontece em letras maiúsculas.
Eu esperava
{"handDrive": right}
mas pegue
{"handDrive": RIGHT}
Este é um trecho do meu código...
@XmlType
@XmlEnum(String.class)
public enum HandDrive {
@XmlEnumValue("right")
RIGHT("right"), //
@XmlEnumValue("left")
LEFT("left");
}
ObjectMapper mapper = new ObjectMapper();
Car c = new Car();
c.setHandDrive(HandDrive.RIGHT);
mapper.setSerializationInclusion(Include.NON_NULL);
// convert Java object to JSON string
String jsonString = null;
try {
jsonString = mapper.writeValueAsString(c);
System.out.println(jsonString);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return jsonString;
Como suas constantes enum são fornecidas com um argumento, presumo que você omitiu um
String
campo e um construtor de um argumento na definição deHandDrive
quando postou sua pergunta.Por padrão, Jackson serializa valores enum com o nome da constante correspondente. É por isso que o JSON produzido contém
RIGHT
orLEFT
. Se você quiser serializar um enum com um de seus campos, você pode usar a anotação@JsonValue
ou um serializador personalizado.Abordagem @JsonValue
Ao usar
@JsonValue
, você não precisa mais de anotações XML. Na verdade, essa anotação funciona para serializações JSON e XML. Para usá-la, basta anotar o campovalue
ou seu gettergetValue()
com ela. Aqui está uma demonstração no OneCompiler .Abordagem de serializador personalizado para enum específico
Se você não quiser usar nenhuma anotação, você pode definir um serializador personalizado para o enum
HandDrive
e então registrá-lo como um módulo emObjectMapper
eXmlMapper
. Aqui está uma demonstração no OneCompiler .Abordagem de serializador personalizado para qualquer enum
Caso você queira definir um único serializador personalizado para qualquer enum encontrado durante o processo de marshalling, você pode fazer seu serializador personalizado subtype
Enum
, fornecer o nome de um campo para usar como valor de serialização e, em seguida, usar reflection para recuperar o valor do campo. Aqui está uma demonstração em OneCompiler .