如何从杰克逊的序列化中排除一个集合元素?

时间:2017-03-15 10:51:57

标签: java json jackson

我有Set Components

final class User{

    private final Set<Component> COMPONENTS;

    public User(String userID)
    {
        this.userID = userID;
        COMPONENTS = Collections.unmodifiableSet(new HashSet<>(Arrays.asList(
                     new AuthorizationComponent(this.getUserID())
                     new ProfileComponent(this.getUserID()),
                     new ThemeComponent(this.getUserID()))
            ));
    }
}

每个组件:Auth,Profile,Theme是Component

的子类

现在,我创建了一个User并将其转换为JSON字符串:

ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(user);

我需要从此AuthorizationComponent中排除String。我知道我可以使用transient修饰符和@JsonIgnore注释 - 但这仅适用于字段,我只需要删除一个集合元素。

这可能吗?

2 个答案:

答案 0 :(得分:0)

不,我不认为这是可能的,至少不是没有重大努力。您可以编写自己的自定义序列化程序(请参阅Jackson How-To: Custom Serializers)。例如,您可以自定义Set的序列化程序并过滤掉“坏”的分类。但是,我不确定这是否值得付出努力,特别是稍后维护代码,因为理解解决方案需要熟悉Jackson的内部。

其他选择:

  • 使用单独的字段,而不是使用Set的单个字段。在类User内单独的字段,或创建容器对象(ConfigComponents或类似的),然后每个组件有一个字段。根据我的经验,使用普通SetList来包含不同类的实例通常不是一个好的解决方案 - 你想要更多结构的东西。
  • 不要完全排除AuthorizationComponent,而只排除导致问题的类的字段。这就是问题的一步。

最适合您的情况取决于您的项目以及如何使用这些类。

答案 1 :(得分:0)

您可以为班级User定义自定义序列化工具

来源:Jackson – Custom Serializer

自定义序列化程序示例:

public class ItemSerializer extends StdSerializer<Item> {

    public ItemSerializer() {
        this(null);
    }

    public ItemSerializer(Class<Item> t) {
        super(t);
    }

    @Override
    public void serialize(
      Item value, JsonGenerator jgen, SerializerProvider provider) 
      throws IOException, JsonProcessingException {

        jgen.writeStartObject();
        jgen.writeNumberField("id", value.id);
        jgen.writeStringField("itemName", value.itemName);
        jgen.writeNumberField("owner", value.owner.id);
        jgen.writeEndObject();
    }
}