Cómo cambiar un nombre de campo en JSON usando Jackson

169

Estoy usando jackson para convertir un objeto mío en json. El objeto tiene 2 campos:

@Entity
public class City {
   @id
   Long id;
   String name;
   public String getName() { return name; }
   public void setName(String name){ this.name = name; }
   public Long getId() { return id; }
   public void setName(Long id){ this.id = id; }
}

Como quiero usar esto con la función de autocompletar jQuery, quiero que 'id' aparezca como 'valor' en json y 'nombre' aparezca como 'etiqueta'. La documentación de Jackson no está claro en esto y lo he intentado cada anotación que ni remotamente parece que hace lo que necesito, pero no puedo conseguir namea aparecer como labely idpara que aparezca como valueen el JSON.

¿Alguien sabe cómo hacer esto o si esto es posible?

Ali
fuente
si alguna vez fuera a utilizar potencialmente la entidad ("Ciudad") para cualquier otro propósito o lógica comercial, evitaría definir su representación JSON como Etiqueta y Valor. OTOH, si se trata solo de datos de referencia utilizados para combos, es probable que tenga más: crear una entidad genérica (Par u Opción) para cubrir todo esto es un posible enfoque a considerar.
Thomas W

Respuestas:

323

¿Has intentado usar @JsonProperty?

@Entity
public class City {
   @id
   Long id;
   String name;

   @JsonProperty("label")
   public String getName() { return name; }

   public void setName(String name){ this.name = name; }

   @JsonProperty("value")
   public Long getId() { return id; }

   public void setId(Long id){ this.id = id; }
}
henrik_lundgren
fuente
55
Sí, lo había intentado, sin embargo, estaba haciendo @JsonProperty(value="label")y no estaba funcionando, lo he intentado como me lo sugirió y funciona. gracias hombre, esto realmente ayudará a simplificar el código ahora.
Ali
Tengo un requerimiento similar. Solo que estoy usando Jackson con RESTEasy y esto no funciona: - / ¡Extraño!
Niks
verificar que Jackson realmente es el proveedor configurado y no otra cosa
henrik_lundgren
2
¿Hay alguna manera de aprovechar Jackson (o GSON) para cambiar el nombre de una propiedad en una cadena JSON ya existente (no durante la serialización)?
Don Cheadle
He usado el objeto @JsonProperty ("objeto") val jsonObject: String, ... pero falló
Raju yourPepe
45

Tenga en cuenta que hay org.codehaus.jackson.annotate.JsonPropertyen Jackson 1.xy com.fasterxml.jackson.annotation.JsonPropertyJackson 2.x. Comprueba qué ObjectMapper estás usando (de qué versión) y asegúrate de usar la anotación adecuada.

m3th0dman
fuente
También hay un org.json4s.jacksonespacio de nombres. :) y posiblemente otra implementación de jacksonYMMV.
Jesse Chisholm
14

Hay una opción más para cambiar el nombre del campo:

Jackson MixIns .

Es útil si trata con clases de terceros, que no puede anotar , o simplemente no desea contaminar la clase con anotaciones específicas de Jackson.

La documentación de Jackson para Mixins está desactualizada, por lo que este ejemplo puede proporcionar más claridad. En esencia: crea una clase mixin que realiza la serialización de la manera que desee. Luego regístralo en ObjectMapper:

objectMapper.addMixIn(ThirdParty.class, MyMixIn.class);
Dimitar II
fuente
Tengo curiosidad de que esto afecte el rendimiento al serializar / deserializar campos.
chanllen
2

Jackson

Si está usando Jackson, puede usar la @JsonPropertyanotación para personalizar el nombre de una propiedad JSON dada.

Por lo tanto, solo tiene que anotar los campos de entidad con la @JsonPropertyanotación y proporcionar un nombre de propiedad JSON personalizado, como este:

@Entity
public class City {

   @Id
   @JsonProperty("value")
   private Long id;

   @JsonProperty("label")
   private String name;

   //Getters and setters omitted for brevity
}

JavaEE o JakartaEE JSON-B

JSON-B es la capa de enlace estándar para convertir objetos Java hacia y desde JSON. Si está utilizando JSON-B, puede anular el nombre de la propiedad JSON mediante la @JsonbPropertyanotación:

@Entity
public class City {

   @Id
   @JsonbProperty("value")
   private Long id;

   @JsonbProperty("label")
   private String name;

   //Getters and setters omitted for brevity
}
Vlad Mihalcea
fuente