![](/img/trans.png)
[英]Modify HTTP code when Serialize skipping objects conditionally that meet a Custom Criteria with Jackson (Spring boot)
[英]How to serialize List that meet Custom Criteria with Jackson
我尝试在包含带注释的对象列表的列表上应用自定义序列化程序。 如果用户未被授予(角色不像user ),我想删除这些属性。 当属性不是列表时,它运行良好( 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());
}
}
但是我无法访问列表中包含的对象。 我想定义一个特定于列表中包含的对象类型的序列化程序,因为类上的注释角色是不同的。
你可以帮帮我吗 ?
谢谢
尝试以下代码进行序列化:
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();
}
}
您可以从此处阅读更多信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.