Come cambiare il nome di un campo in JSON usando Jackson


169

Sto usando Jackson per convertire un mio oggetto in Jackson. L'oggetto ha 2 campi:

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

Dal momento che voglio usarlo con la funzione di completamento automatico di jQuery, voglio che "id" appaia come "valore" in json e che "nome" appaia come "etichetta". La documentazione di Jackson non è chiara su questo e ho provato ogni annotazione che anche da remoto sembra fare ciò di cui ho bisogno ma non riesco namead apparire come labele idad apparire come valuenel json.

Qualcuno sa come fare questo o se questo è possibile?


se mai avessi intenzione di utilizzare l'entità ("Città") per qualsiasi altro scopo o logica aziendale, eviterei di definire la sua rappresentazione JSON come Etichetta e Valore. OTOH se si tratta di dati puramente di riferimento utilizzati per le combo, probabilmente ne avrai di più: creare un'entità generica (coppia o opzione) per coprire tutti questi è un possibile approccio da considerare.
Thomas W,

Risposte:


323

Hai provato a utilizzare @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; }
}

5
Sì, ci avevo provato, comunque stavo facendo @JsonProperty(value="label")e non funzionava, l'ho provato come mi hai suggerito e funziona! grazie amico, questo aiuterà davvero a semplificare il codice ora.
Ali,

Ho un requisito simile. Solo che sto usando Jackson con RESTEasy e questo non funziona: - / Strano!
Niks,

verifica che Jackson sia davvero il provider configurato e non qualcos'altro
henrik_lundgren,

2
c'è un modo per sfruttare Jackson (o GSON) per cambiare il nome di una proprietà in una stringa JSON già esistente (non durante la serializzazione)?
Don Cheadle,

Ho usato l'oggetto @JsonProperty ("oggetto") val jsonObject: String, ... ma non riuscito
Raju yourPepe

45

Essere consapevoli del fatto che esiste org.codehaus.jackson.annotate.JsonPropertyin Jackson 1.xe com.fasterxml.jackson.annotation.JsonPropertyin Jackson 2.x. Controlla quale ObjectMapper stai utilizzando (da quale versione) e assicurati di utilizzare l'annotazione corretta.


C'è anche uno org.json4s.jacksonspazio dei nomi. :) e forse altre implementazioni di jacksonYMMV.
Jesse Chisholm,

14

Esiste un'altra opzione per rinominare il campo:

Jackson MixIns .

Utile se hai a che fare con classi di terze parti, che non sei in grado di annotare , o semplicemente non vuoi inquinare la classe con annotazioni specifiche di Jackson.

La documentazione di Jackson per Mixins è obsoleta, quindi questo esempio può fornire maggiore chiarezza. In sostanza: si crea una classe di mixin che esegue la serializzazione nel modo desiderato. Quindi registralo su ObjectMapper:

objectMapper.addMixIn(ThirdParty.class, MyMixIn.class);

Sono curioso di influenzare le prestazioni durante la serializzazione / la deserializzazione dei campi?
Chanllen,

2

Jackson

Se si utilizza Jackson, è possibile utilizzare l' @JsonPropertyannotazione per personalizzare il nome di una determinata proprietà JSON.

Pertanto, devi solo annotare i campi dell'entità con l' @JsonPropertyannotazione e fornire un nome di proprietà JSON personalizzato, come questo:

@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 è il layer di associazione standard per la conversione di oggetti Java da e verso JSON. Se si utilizza JSON-B, è possibile sovrascrivere il nome della proprietà JSON tramite l' @JsonbPropertyannotazione:

@Entity
public class City {

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

   @JsonbProperty("label")
   private String name;

   //Getters and setters omitted for brevity
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.