Ответ 1
У вас есть два варианта:
У меня есть класс User, который я хочу сопоставить с JSON, используя Jackson.
public class User {
private String name;
private int age;
prviate int securityCode;
// getters and setters
}
Я сопоставляю это с строкой JSON, используя -
User user = getUserFromDatabase();
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(user);
Я не хочу отображать переменную securityCode
. Есть ли способ конфигурирования картографа, чтобы он игнорировал это поле?
Я знаю, что могу писать пользовательские карты данных или использовать Streaming API, но я хотел бы знать, можно ли это сделать через конфигурацию?
У вас есть два варианта:
вы также можете собрать все свойства в классе аннотации
@JsonIgnoreProperties( { "applications" })
public MyClass ...
String applications;
Добавление этого здесь, потому что кто-то еще может искать это снова в будущем, как и я. Этот ответ является расширением Принятый ответ
You have two options:
1. Jackson works on setters-getters of fields. So, you can just remove getter of field which you want to omit in JSON. ( If you don't need getter at other place.)
2. Or, you can use the `@JsonIgnore` [annotation of Jackson][1] on getter method of that field and you see there in no such key-value pair in resulted JSON.
@JsonIgnore
public int getSecurityCode(){
return securityCode;
}
На самом деле, более новая версия Jackson добавила READ_ONLY и WRITE_ONLY аргументы аннотации для JsonProperty. Таким образом, вы также можете сделать что-то вроде этого.
@JsonProperty(access = Access.WRITE_ONLY)
private String securityCode;
вместо
@JsonIgnore
public int getSecurityCode(){
return securityCode;
}
Если вы не хотите размещать аннотации на ваших Pojos, вы также можете использовать Genson.
Вот как вы можете исключить поле с ним без каких-либо аннотаций (вы также можете использовать аннотации, если хотите, но у вас есть выбор).
Genson genson = new Genson.Builder().exclude("securityCode", User.class).create();
// and then
String json = genson.serialize(user);
вы можете использовать аннотации @JsonIgnore http://wiki.fasterxml.com/JacksonAnnotations
Если вы используете GSON, вам нужно пометить объявления полей/элементов как @Expose и использовать GsonBuilder(). excludeFieldsWithoutExposeAnnotation(). create()
Не забудьте пометить свои подкласс с помощью @Expose, иначе поля не будут отображаться.
У меня был похожий случай, когда мне нужно было десериализовать некоторое свойство (JSON to Object), но не сериализовать (Object to JSON)
Сначала я @JsonIgnore
- он предотвратил сериализацию нежелательного свойства, но не смог де-сериализовать его. Попытка value
атрибута тоже не помогла, так как требует некоторых условий.
Наконец, работа @JsonProperty
с атрибутом access
работала, как шарм.
Уровень поля:
public class User {
private String name;
private int age;
@JsonIgnore
private int securityCode;
// getters and setters
}
Уровень класса:
@JsonIgnoreProperties(value = { "securityCode" })
public class User {
private String name;
private int age;
private int securityCode;
}