Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Jackson中从序列化中排除一个集合元素?_Java_Json_Jackson - Fatal编程技术网

Java 如何在Jackson中从序列化中排除一个集合元素?

Java 如何在Jackson中从序列化中排除一个集合元素?,java,json,jackson,Java,Json,Jackson,我有一套组件: final class User{ private final Set<Component> COMPONENTS; public User(String userID) { this.userID = userID; COMPONENTS = Collections.unmodifiableSet(new HashSet<>(Arrays.asList(

我有一套
组件

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()))
            ));
    }
}
我需要从该
字符串中排除
授权组件
。我知道我可以使用一个
transient
修饰符和一个
@JsonIgnore
注释-但这只适用于字段,我只需要删除一个集合元素


这可能吗?

不,我认为这是不可能的,至少不需要付出很大的努力。您可以编写自己的自定义序列化程序(请参阅)。例如,您可以为
Set
定制序列化程序,并过滤掉“坏”类。但是,我不确定这是否值得,特别是在以后维护代码方面,因为理解解决方案需要对Jackson的内部结构非常熟悉

其他选择:

  • 使用单独的字段,而不是将一个字段设置为
    。在类
    User
    中创建单独的字段,或者创建一个容器对象(
    ConfigComponents
    或类似对象),然后每个组件都有一个字段。根据我的经验,使用普通的
    Set
    List
    来包含不同类的实例通常不是一个好的解决方案-您需要更具结构的东西
  • 不要完全排除
    AuthorizationComponent
    ,只排除引起问题的类的字段。这一方回避了问题

在您的情况下,什么是最合适的取决于您的项目,以及如何使用这些类。

不,我认为这是不可能的,至少不需要付出很大的努力。您可以编写自己的自定义序列化程序(请参阅)。例如,您可以为
Set
定制序列化程序,并过滤掉“坏”类。但是,我不确定这是否值得,特别是在以后维护代码方面,因为理解解决方案需要对Jackson的内部结构非常熟悉

其他选择:

  • 使用单独的字段,而不是将一个字段设置为
    。在类
    User
    中创建单独的字段,或者创建一个容器对象(
    ConfigComponents
    或类似对象),然后每个组件都有一个字段。根据我的经验,使用普通的
    Set
    List
    来包含不同类的实例通常不是一个好的解决方案-您需要更具结构的东西
  • 不要完全排除
    AuthorizationComponent
    ,只排除引起问题的类的字段。这一方回避了问题

在您的情况下,什么最合适将取决于您的项目以及类的使用方式。

您可以为类
用户定义自定义序列化程序

资料来源:

自定义序列化程序的示例:

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();
    }
}
public类ItemSerializer扩展了StdSerializer{
公共项序列化程序(){
这个(空);
}
公共项序列化程序(t类){
超级(t);
}
@凌驾
公共无效序列化(
项目值,JsonGenerator jgen,SerializerProvider提供程序)
抛出IOException、JsonProcessingException{
jgen.writeStartObject();
jgen.writeNumberField(“id”,value.id);
jgen.writeStringField(“itemName”,value.itemName);
jgen.writeNumberField(“所有者”,value.owner.id);
jgen.writeEndObject();
}
}

您可以为类
用户定义自定义序列化程序

资料来源:

自定义序列化程序的示例:

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();
    }
}
public类ItemSerializer扩展了StdSerializer{
公共项序列化程序(){
这个(空);
}
公共项序列化程序(t类){
超级(t);
}
@凌驾
公共无效序列化(
项目值,JsonGenerator jgen,SerializerProvider提供程序)
抛出IOException、JsonProcessingException{
jgen.writeStartObject();
jgen.writeNumberField(“id”,value.id);
jgen.writeStringField(“itemName”,value.itemName);
jgen.writeNumberField(“所有者”,value.owner.id);
jgen.writeEndObject();
}
}

此链接对您有帮助吗?这个链接对你有帮助吗?