it-swarm.com.ru

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

Я использую Джексона, чтобы преобразовать мой объект в 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.

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

148
Ali

Вы пытались использовать @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; }
}
286
henrik_lundgren

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

42
m3th0dman

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

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

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

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

objectMapper.addMixIn(ThirdParty.class, MyMixIn.class);
8
Dimitar II