繁体   English   中英

如何序列化符合杰克逊自定义标准的列表

[英]How to serialize List that meet Custom Criteria with Jackson

我尝试在包含带注释的对象列表的列表上应用自定义序列化程序。 如果用户未被授予(角色不像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;
    }

}

我的第一种方法是为 mapper 注册一个新模块

  @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());
    }
}

但是我无法访问列表中包含的对象。 我想定义一个特定于列表中包含的对象类型的序列化程序,因为类上的注释角色是不同的。

你可以帮帮我吗 ?

谢谢

尝试以下代码进行序列化:

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

您可以从此处阅读更多信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM