Как изменить имя поля в JSON с помощью Jackson

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и idпоявляться , как valueв формате JSON.

Кто-нибудь знает, как это сделать или это возможно?

Али
источник
Если бы вы когда-нибудь собирались использовать объект («Город») для каких-либо других целей или бизнес-логики, я бы не стал определять его представление JSON как «Метка и значение». OTOH, если это чисто справочные данные, используемые для комбо, у вас, вероятно, будет больше - создание общего объекта (Pair или Option), чтобы охватить все это - возможный подход для рассмотрения.
Томас В.

Ответы:

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; }
}
henrik_lundgren
источник
5
Да, я пробовал это, однако я делал, @JsonProperty(value="label")и это не работало, я попробовал, как вы предложили, и это работает! спасибо человек это действительно поможет упростить код сейчас.
Али
У меня аналогичное требование. Просто я использую Джексона с RESTEasy, и это не работает: - / Странно!
Никс
убедитесь, что Джексон действительно настроенный провайдер, а не что-то другое
henrik_lundgren
2
Есть ли способ использовать Джексона (или GSON) для изменения имени свойства в уже существующей строке JSON (не во время сериализации)?
Дон Чидл
Я использовал объект @JsonProperty ("объект") val jsonObject: String, ... но не удалось
Раджу yourPepe
45

Имейте в виду, что есть org.codehaus.jackson.annotate.JsonPropertyв Jackson 1.x и com.fasterxml.jackson.annotation.JsonPropertyв Jackson 2.x. Проверьте, какой ObjectMapper вы используете (из какой версии), и убедитесь, что вы используете правильную аннотацию.

m3th0dman
источник
Существует также org.json4s.jacksonпространство имен. :) и, возможно, другая реализация jacksonYMMV.
Джесси Чисхолм,
14

Есть еще один вариант переименовать поле:

Джексон Миксинс .

Полезно, если вы имеете дело со сторонними классами, которые вы не можете аннотировать , или просто не хотите загрязнять класс специальными аннотациями Джексона.

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

objectMapper.addMixIn(ThirdParty.class, MyMixIn.class);
Димитар II
источник
Мне интересно, повлияет ли это на производительность при сериализации / десериализации полей?
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
}
Влад Михалча
источник