当前位置: 首页 > 知识库问答 >
问题:

如何使用Jackson序列化满足自定义条件的列表

谢昊乾
2023-03-14

我尝试在包含带有注释的对象列表的列表上应用自定义序列化程序。如果未授予用户权限(角色与用户不同),我想删除这些属性。当属性不是列表时,它工作得很好(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());
    }
}

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

你能帮帮我吗?

谢啦

共有1个答案

赫连捷
2023-03-14

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

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

您可以从这里阅读更多信息。

 类似资料:
  • 问题内容: 我有两个要使用Jackson序列化为JSON的Java类: 我想将Item序列化为此JSON: 用户序列化为仅包含。我还将能够将所有用户对象序列化为JSON,例如: 所以我想我需要为此编写一个自定义的序列化程序并尝试过: 我使用来自Jackson How-to:Custom Serializers的 代码对JSON进行了序列化: 但是我得到这个错误: 如何在Jackson上使用自定义序

  • 问题内容: 我正在使用Flickr API 。调用该方法时,默认的JSON结果为: 我想将此响应解析为Java对象: JSON属性应按以下方式映射: 不幸的是,我无法找到一种使用Annotations做到这一点的好方法。到目前为止,我的方法是将JSON字符串读入a 并从中获取值。 但是我认为,这是有史以来最不优雅的方式。有没有简单的方法,可以使用注释还是自定义反序列化器? 这对我来说将是很明显的,

  • 问题内容: 我有两个要使用Jackson序列化为JSON的Java类: 我想将Item序列化为此JSON: 用户序列化为仅包含。我还将能够将所有用户对象序列化为,例如: 所以我想我需要为此编写一个自定义的序列化程序并尝试过: 我使用来自的以下代码对JSON进行了序列化: 但是我得到这个错误: 如何在Jackson上使用自定义序列化程序? 这就是我对Gson的处理方式: 但是我现在需要和Jackso

  • 我有下面的JSON,我正试图使用Jackson API反序列化它 我基本上需要一个附件类,它有一个AttachmentFile对象列表,如下所示: 如何使用自定义反序列化器实现这一点? 谢谢

  • 下面的代码再现了这个问题: 上面的代码不做其他注册“自定义”序列化程序的事情(只是委托回原始序列化程序),但它生成的JSON没有null属性: {“第一个”:“鲍勃”,“最后一个”:“巴克”} 我读过许多看似相关的SO文章,但没有一篇能让我找到解决方案。我尝试在序列化时显式地将映射器设置为,但没有成功。 我唯一的线索是JavaDoc for JsonSerializer中的一条注释: 注意:永远不

  • 我试图创建会影响序列化值的自定义jackson注释。 意思是: 现在序列化对象X(10)将导致: 我怎样才能做到这一点?