Jackson kullanarak JSON bir alan adı nasıl değiştirilir


169

Bir nesneyi json'a dönüştürmek için jackson kullanıyorum. Nesnenin 2 alanı vardır:

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

Bunu jQuery otomatik tamamlama özelliğiyle kullanmak istediğim için 'id' nin json'da 'değer' olarak ve 'name' 'etiket' olarak görünmesini istiyorum. Jackson dokümantasyonu bu konuda net değildir ve bunun neye ihtiyacım yok ama olamıyorum gibi uzaktan dahi görünüyor ki her ek açıklama denedim nameolarak görünmesini labelve idolarak görünmesini valuejson içinde.

Herkes bunun nasıl yapılacağını veya mümkün olup olmadığını biliyor mu?


Eğer varlığı ("Şehir") başka bir amaç veya iş mantığı için potansiyel olarak kullanacak olsaydınız, JSON temsilini Etiket ve Değer olarak tanımlamaktan kaçınırdım. OTOH, bu sadece kombinasyonlar için kullanılan referans verilerse, muhtemelen daha fazlasına sahip olacaksınız - bunların tümünü kapsayacak şekilde genel bir varlık (Eşleştirme veya Seçenek) yapma dikkate alınması muhtemel bir yaklaşımdır.
Thomas W

Yanıtlar:


323

@JsonProperty kullanmayı denediniz mi?

@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
Evet, bunu denemiştim, ancak yapıyordum @JsonProperty(value="label")ve işe yaramıyordu, önerdiğiniz gibi denedim ve işe yarıyor! teşekkürler adam bu gerçekten şimdi kodu basitleştirmek yardımcı olacaktır.
Ali

Benzer bir gereksinimim var. Sadece Jackson'ı RESTEasy ile kullanıyorum ve bu işe yaramıyor: - / Strange!
Niks

Jackson'ın yapılandırılmış sağlayıcı olduğunu ve başka bir şey olmadığını doğrulayın
henrik_lundgren

2
zaten var olan bir JSON dizesindeki bir özellik adını değiştirmek için Jackson (veya GSON) kullanmanın bir yolu var mı (serileştirme sırasında değil)?
Don Cheadle

@JsonProperty ("object") nesnesini kullandım val jsonObject: String, ... ama başarısız oldu
Raju yourPepe

45

Olduğunu unutmayın org.codehaus.jackson.annotate.JsonPropertyJackson 1.x ve com.fasterxml.jackson.annotation.JsonPropertyJackson 2.x Hangi ObjectMapper kullandığınızı (hangi sürümden) kontrol edin ve uygun ek açıklamayı kullandığınızdan emin olun.


Ayrıca bir org.json4s.jacksonad alanı da var. :) ve muhtemelen jacksonYMMV'nin diğer uygulamaları .
Jesse Chisholm

14

Alanı yeniden adlandırmak için bir seçenek daha var:

Jackson MixIns .

Ek açıklama ekleyemediğiniz üçüncü taraf sınıflarıyla ilgileniyorsanız veya sınıfı Jackson'a özgü ek açıklamalarla kirletmek istemiyorsanız kullanışlıdır.

Mixins için Jackson belgeleri eskidir, bu nedenle bu örnek daha fazla netlik sağlayabilir. Özünde: serileştirmeyi istediğiniz şekilde yapan mixin sınıfı oluşturursunuz. Ardından ObjectMapper'a kaydedin:

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

Alanların serileştirilmesi / serileştirilmesi sırasında performansı etkileyeceğini merak ediyorum.
chanllen

2

Jackson

Jackson kullanıyorsanız, @JsonPropertybelirli bir JSON özelliğinin adını özelleştirmek için ek açıklamayı kullanabilirsiniz .

Bu nedenle, varlık alanlarına açıklama ekleyerek açıklama @JsonPropertyeklemeniz ve aşağıdaki gibi özel bir JSON özellik adı sağlamanız gerekir:

@Entity
public class City {

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

   @JsonProperty("label")
   private String name;

   //Getters and setters omitted for brevity
}

JavaEE veya JakartaEE JSON-B

JSON-B, Java nesnelerini JSON'a ve JSON'dan dönüştürmek için standart ciltleme katmanıdır. JSON-B kullanıyorsanız, @JsonbPropertyek açıklama yoluyla JSON özellik adını geçersiz kılabilirsiniz :

@Entity
public class City {

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

   @JsonbProperty("label")
   private String name;

   //Getters and setters omitted for brevity
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.