Подтвердить что ты не робот

Хотите скрыть некоторые поля объекта, который сопоставляется с JSON от Jackson

У меня есть класс 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, но я хотел бы знать, можно ли это сделать через конфигурацию?

4b9b3361

Ответ 1

У вас есть два варианта:

  • Джексон работает над сеттерами-получателями полей. Таким образом, вы можете просто удалить getter поля, которое вы хотите пропустить в JSON. (Если вам не нужен геттер в другом месте.)

  • Или вы можете использовать аннотацию @JsonIgnore

Ответ 2

вы также можете собрать все свойства в классе аннотации

@JsonIgnoreProperties( { "applications" })
public MyClass ...

String applications;

Ответ 3

Добавление этого здесь, потому что кто-то еще может искать это снова в будущем, как и я. Этот ответ является расширением Принятый ответ

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

Ответ 4

Если вы не хотите размещать аннотации на ваших Pojos, вы также можете использовать Genson.

Вот как вы можете исключить поле с ним без каких-либо аннотаций (вы также можете использовать аннотации, если хотите, но у вас есть выбор).

Genson genson = new Genson.Builder().exclude("securityCode", User.class).create();
// and then
String json = genson.serialize(user);

Ответ 6

Если вы используете GSON, вам нужно пометить объявления полей/элементов как @Expose и использовать GsonBuilder(). excludeFieldsWithoutExposeAnnotation(). create()

Не забудьте пометить свои подкласс с помощью @Expose, иначе поля не будут отображаться.

Ответ 7

У меня был похожий случай, когда мне нужно было десериализовать некоторое свойство (JSON to Object), но не сериализовать (Object to JSON)

Сначала я @JsonIgnore - он предотвратил сериализацию нежелательного свойства, но не смог де-сериализовать его. Попытка value атрибута тоже не помогла, так как требует некоторых условий.

Наконец, работа @JsonProperty с атрибутом access работала, как шарм.

Ответ 8

Уровень поля:

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