我有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
注释 - 但这仅适用于字段,我只需要删除一个集合元素。
这可能吗?
答案 0 :(得分:0)
不,我不认为这是可能的,至少不是没有重大努力。您可以编写自己的自定义序列化程序(请参阅Jackson How-To: Custom Serializers)。例如,您可以自定义Set
的序列化程序并过滤掉“坏”的分类。但是,我不确定这是否值得付出努力,特别是稍后维护代码,因为理解解决方案需要熟悉Jackson的内部。
其他选择:
Set
的单个字段。在类User
内单独的字段,或创建容器对象(ConfigComponents
或类似的),然后每个组件有一个字段。根据我的经验,使用普通Set
或List
来包含不同类的实例通常不是一个好的解决方案 - 你想要更多结构的东西。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();
}
}