Как сериализовать список, который соответствует пользовательским критериям с Джексоном - PullRequest
0 голосов
/ 02 марта 2020

Я пытаюсь применить пользовательский сериализатор к списку, который содержит список объектов с аннотацией. Я хотел бы удалить это свойство, если пользователю не предоставлено (роль не такая, как user ). Это работает хорошо, когда свойство не является списком (https://www.baeldung.com/jackson-serialize-field-custom-criteria)

** ОБНОВЛЕНИЕ **

public class Catalog {
  private List<Customer> customers;
  private List<Order> orders;
  // getter & setter
}

@Role(name = "user")
public class Customer extends Hidden {
   private String name;
   // getter & setter
}

@Role(name = "admin")
public class Order extends Hidden {
   private int id;
   // getter & setter
}

@JsonIgnoreProperties(ignoreUnknown = true)
public class Hidden implements Hidable {

    @Schema(hidden = true )
    @JsonIgnore
    protected boolean hidden;

    @Override
    public boolean isHidden() {
        return hidden;
    }

    public void setHidden(final boolean hidden) {
        this.hidden = hidden;
    }

}

Мой первый подход состоял в регистрации нового модуля для маппера

  @Override
  public JsonSerializer<?> modifyCollectionSerializer(SerializationConfig config,
          CollectionType valueType, BeanDescription beanDesc, JsonSerializer<?> serializer) {                        
      System.out.println("modifySerializer "+beanDesc.getBeanClass().getName());
      // create new serializer depand on type Order
      // If list contains Order then return new OrderSerializer((JsonSerializer<Object>) serializer);
      // If list contains Customerthen return new CustomerSerializer((JsonSerializer<Object>) serializer);
      // default
      return new CollectionSerializer((JsonSerializer<Object>) serializer);
  }

И мой пользовательский сериализатор

public class CollectionSerializer extends JsonSerializer<List<? extends Hidden>> {

    private JsonSerializer<Object> defaultSerializer;

    public CollectionSerializer(final JsonSerializer<Object> serializer) {
        defaultSerializer = serializer;
    }

    @Override
    public void serialize(List<? extends Hidden> value, JsonGenerator jgen,
            SerializerProvider provider) throws IOException {
        System.out.println("HealthSerializer");
        if (value.get(0).isHidden())
            return;
        defaultSerializer.serialize(value, jgen, provider);
    }

    @Override
    public boolean isEmpty(final SerializerProvider provider, final List<? extends Hidden> value) {
        return (value == null || value.get(0).isHidden());
    }
}

Но я не могу достать объект, содержащийся в списке. Я хотел бы определить сериализатор, определяющий c для типа объекта, содержащегося в списке, потому что аннотированная роль в классе различна.

Не могли бы вы мне помочь?

Спасибо

1 Ответ

0 голосов
/ 02 марта 2020

Попробуйте использовать приведенный ниже код для сериализации:

public class JacksonTest {
    public static void main(String[] args) throws JsonProcessingException {
        ArrayList<Test> tests = new ArrayList<>();
        Test test = new Test("name", "user");
        tests.add(test);
        test = new Test("name", "developer");
        tests.add(test);
        ObjectMapper objectMapper = new ObjectMapper();
        SimpleModule simpleModule = new SimpleModule();
        simpleModule.addSerializer(Test.class, new TestClassSerializer());
        objectMapper.registerModule(simpleModule);

        System.out.println(objectMapper.writeValueAsString(tests));
    }

}

class Test {
    private String name;
    private String role;

    public String getRole() {
        return role;
    }

    public void setRole(String role) {
        this.role = role;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Test(String name, String role) {
        this.name = name;
        this.role = role;
    }
}

class TestClassSerializer extends StdSerializer<Test> {

    public TestClassSerializer() {
        this(null);
    }

    public TestClassSerializer(Class<Test> t) {
        super(t);
    }

    @Override
    public void serialize(
            Test value, JsonGenerator jgen, SerializerProvider provider)
            throws IOException, JsonProcessingException {
        jgen.writeStartObject();
        if (value.getRole().equals("user")) {
            jgen.writeStringField("name", value.getName());
            jgen.writeStringField("role", value.getRole());
        }
        jgen.writeEndObject();
    }
}

Более подробную информацию можно получить по здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...