Як змінити ім'я поля в JSON за допомогою Джексона


169

Я використовую Джексона для перетворення мого об'єкта в json. Об'єкт має 2 поля:

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

Оскільки я хочу використовувати це з функцією автоматичного завершення jQuery, я хочу, щоб "id" відображався як "значення" у json, а "name" - як "label". Документація Джексона не є чіткою щодо цього, і я намагався будь-яку примітку, яка навіть віддалено здається, що це робить те, що мені потрібно, але я не можу потрапити nameяк з'явитися як labelі idз'явитися як valueу json.

Хтось знає, як це зробити чи якщо це можливо?


якщо ви коли-небудь потенційно збираєтеся використовувати сутність ("Місто") для будь-якої іншої мети чи логіки бізнесу, я б не визначив його представлення JSON як Label & Value. OTOH, якщо це суто довідкові дані, що використовуються для комбінацій, то, швидше за все, у вас буде більше - зробити загальну сутність (пара або опцію) для покриття всього цього можливий підхід, який слід врахувати.
Томас Ш

Відповіді:


323

Ви спробували використовувати @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
Так, я спробував це, однак я робив, @JsonProperty(value="label")і це не працювало, я спробував це, як ви запропонували, і це працює! дякую людині, це дійсно допоможе спростити код зараз.
Алі

У мене є аналогічна вимога. Просто я використовую Джексона разом з RESTEasy, і це не працює: - / Дивно!
Нікс

переконайтеся, що Джексон насправді є налаштованим постачальником, а не щось інше
henrik_lundgren

2
чи є спосіб використовувати Джексона (або GSON) для зміни імені властивості у вже існуючій рядку JSON (не під час серіалізації)?
Дон Чейдл

Я використав об'єкт @JsonProperty ("об'єкт") val jsonObject: String, ... але не вдалося
Raju yourPepe

45

Будьте в курсі, що є org.codehaus.jackson.annotate.JsonPropertyу Джексона 1.x та com.fasterxml.jackson.annotation.JsonPropertyу Джексона 2.x. Перевірте, який ObjectMapper ви використовуєте (з якої версії) та переконайтеся, що ви використовуєте належну примітку.


Також є org.json4s.jacksonпростір імен. :) та можливо інша реалізація jacksonYMMV.
Джессі Чизгольм

14

Є ще один варіант перейменування поля:

Джексон MixIns .

Корисно, якщо ви маєте справу з сторонніми класами, які ви не можете коментувати , або просто не хочете забруднювати клас конкретними примітками Джексона.

Документація Джексона на Mixins застаріла, тому цей приклад може забезпечити більшу чіткість. По суті: ви створюєте клас mixin, який виконує серіалізацію так, як вам хочеться. Потім зареєструйте його в ObjectMapper:

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

Мені цікаво, чи вплине це на продуктивність під час серіалізації / десериалізації полів?
chanllen

2

Джексон

Якщо ви використовуєте Джексона, ви можете використовувати @JsonPropertyанотацію, щоб налаштувати ім’я даної властивості JSON.

Отже, вам просто потрібно анотувати поля сутності за допомогою @JsonPropertyанотації та надати користувацьку назву властивості JSON, як це:

@Entity
public class City {

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

   @JsonProperty("label")
   private String name;

   //Getters and setters omitted for brevity
}

JavaEE або JakartaEE JSON-B

JSON-B - стандартний прив'язуючий шар для перетворення об'єктів Java в JSON і з нього. Якщо ви використовуєте JSON-B, ви можете замінити ім'я властивості JSON за допомогою @JsonbPropertyпримітки:

@Entity
public class City {

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

   @JsonbProperty("label")
   private String name;

   //Getters and setters omitted for brevity
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.