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?


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

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.


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);

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
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.