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();
}
}
此链接对您有帮助吗?这个链接对你有帮助吗?