Saltar al contenido

Uso de la anotación Jackson @JsonProperty para clases de datos kotlin

Hacemos una revisión profunda cada enunciado en nuestro sitio web con la meta de mostrarte en todo momento información veraz y actual.

Solución:

@JsonProperty todas las anotaciones en su código se colocan en campos privados dentro de su clase de datos y, de manera predeterminada, Jackson no escanea los campos privados en busca de anotaciones. Tienes que indicarle que haga lo contrario poniendo @JsonAutoDetect anotación:

@JsonAutoDetect(fieldVisibility = Visibility.ANY)
data class CurrencyInfo(
    @JsonProperty("currency_info") var currencyInfo: CurrencyInfoItem?
)

o, alternativamente, puede mover sus anotaciones en los métodos de acceso:

data class CurrencyInfo(
    @get:JsonProperty("currency_info") var currencyInfo: CurrencyInfoItem?
)

Puedes hacer algo como esto:

data class CurrencyInfo @JsonCreator constructor (
        @param:JsonProperty("currency_info") 
        @get:JsonProperty("currency_info")
        val currencyInfo: CurrencyInfoItem?
)

el código anterior se traduce a java como:

public final class CurrencyInfo 
   @Nullable
   private final String currencyInfo;

   @JsonProperty("currency_info")
   @Nullable
   public final String getCurrencyInfo() 
      return this.currencyInfo;
   

   @JsonCreator
   public CurrencyInfo(@JsonProperty("currency_info") @Nullable String currencyInfo) 
      this.currencyInfo = currencyInfo;
   


el código de la respuesta aceptada se traduce a Java de la siguiente manera:

Primero (no es inmutable puro):

@JsonAutoDetect(
   fieldVisibility = Visibility.ANY
)
public final class CurrencyInfo 
   @Nullable
   private String currencyInfo;

   @Nullable
   public final String getCurrencyInfo() 
      return this.currencyInfo;
   

   public final void setCurrencyInfo(@Nullable String var1) 
      this.currencyInfo = var1;
   

   public CurrencyInfo(@JsonProperty("currency_info") @Nullable String currencyInfo) 
      this.currencyInfo = currencyInfo;
   

Segundo (probablemente tiene problemas con la deserialización):

public final class CurrencyInfo 
   @Nullable
   private final String currencyInfo;

   @JsonProperty("currency_info")
   @Nullable
   public final String getCurrencyInfo() 
      return this.currencyInfo;
   

   public CurrencyInfo(@Nullable String currencyInfo) 
      this.currencyInfo = currencyInfo;
   

Puedes agregar el jackson-module-kotlin (https://github.com/FasterXML/jackson-module-kotlin) y registre el módulo kotlin con jackson:

val mapper = ObjectMapper().registerModule(KotlinModule())

Entonces (y muchas otras cosas) funciona automáticamente.

Si estás de acuerdo, tienes la libertad de dejar una noticia acerca de qué te ha gustado de este ensayo.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *