Como alterar um nome de campo em JSON usando Jackson

169

Estou usando jackson para converter um objeto meu em json. O objeto possui 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 eu quero usar isso com o recurso de preenchimento automático do jQuery, quero que 'id' apareça como 'valor' no json e 'name' apareça como 'label'. A documentação de jackson não é clara sobre isso e eu tentei todas as anotações que remotamente parecem fazer o que eu preciso, mas não consigo nameaparecer como labele idaparecer valueno json.

Alguém sabe como fazer isso ou se isso é possível?

Todos
fonte
se você for usar a entidade ("Cidade") para qualquer outro propósito ou lógica comercial, evitaria definir sua representação JSON como Label & Value. OTOH, se estes são puramente dados de referência usados ​​para combos, é provável que você tenha mais - criar uma entidade genérica (Par ou Opção) para cobrir tudo isso é uma abordagem possível a considerar.
Thomas W

Respostas:

323

Você já tentou usar o @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
fonte
5
Sim, eu tentei isso, mas estava fazendo @JsonProperty(value="label")e não estava funcionando, tentei como você sugeriu e funciona! graças cara isso realmente ajudará a simplificar o código agora.
Ali
Eu tenho um requisito semelhante. Só que eu estou usando Jackson com RESTEasy e isso não funciona: - / Estranho!
Niks
verificar se Jackson é realmente o provedor configurado e não outra coisa
henrik_lundgren
2
existe uma maneira de alavancar Jackson (ou GSON) para alterar um nome de propriedade em uma string JSON já existente (não durante a serialização)?
Don Cheadle
Eu usei objeto @JsonProperty ( "objeto") val JSONObject: String, ... mas falhou
Raju yourPepe
45

Esteja ciente de que existe org.codehaus.jackson.annotate.JsonPropertyno Jackson 1.xe com.fasterxml.jackson.annotation.JsonPropertyno Jackson 2.x. Verifique qual ObjectMapper você está usando (de qual versão) e certifique-se de usar a anotação adequada.

m3th0dman
fonte
Há também um org.json4s.jacksonespaço para nome. :) e possivelmente outra implementação do jacksonYMMV.
Jesse Chisholm
14

Há mais uma opção para renomear o campo:

Jackson MixIns .

Útil se você lida com classes de terceiros, que você não pode anotar , ou simplesmente não deseja poluir a classe com anotações específicas de Jackson.

A documentação de Jackson para Mixins está desatualizada, portanto, este exemplo pode fornecer mais clareza. Em essência: você cria uma classe mixin que faz a serialização da maneira que desejar. Em seguida, registre-o no ObjectMapper:

objectMapper.addMixIn(ThirdParty.class, MyMixIn.class);
Dimitar II
fonte
Estou curioso, isso afetará o desempenho ao serializar / desserializar campos?
chanllen
2

Jackson

Se você estiver usando Jackson, poderá usar a @JsonPropertyanotação para personalizar o nome de uma determinada propriedade JSON.

Portanto, você só precisa anotar os campos da entidade com a @JsonPropertyanotação e fornecer um nome de propriedade 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 ou JakartaEE JSON-B

JSON-B é a camada de ligação padrão para converter objetos Java de e para JSON. Se você estiver usando JSON-B, poderá substituir o nome da propriedade JSON através da @JsonbPropertyanotação:

@Entity
public class City {

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

   @JsonbProperty("label")
   private String name;

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