我尝试在包含带有注释的对象列表的列表上应用自定义序列化程序。如果未授予用户权限(角色与用户不同),我想删除这些属性。当属性不是列表时,它工作得很好(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();
}
}
您可以从这里阅读更多信息。
问题内容: 我有两个要使用Jackson序列化为JSON的Java类: 我想将Item序列化为此JSON: 用户序列化为仅包含。我还将能够将所有用户对象序列化为JSON,例如: 所以我想我需要为此编写一个自定义的序列化程序并尝试过: 我使用来自Jackson How-to:Custom Serializers的 代码对JSON进行了序列化: 但是我得到这个错误: 如何在Jackson上使用自定义序
问题内容: 我正在使用Flickr API 。调用该方法时,默认的JSON结果为: 我想将此响应解析为Java对象: JSON属性应按以下方式映射: 不幸的是,我无法找到一种使用Annotations做到这一点的好方法。到目前为止,我的方法是将JSON字符串读入a 并从中获取值。 但是我认为,这是有史以来最不优雅的方式。有没有简单的方法,可以使用注释还是自定义反序列化器? 这对我来说将是很明显的,
问题内容: 我有两个要使用Jackson序列化为JSON的Java类: 我想将Item序列化为此JSON: 用户序列化为仅包含。我还将能够将所有用户对象序列化为,例如: 所以我想我需要为此编写一个自定义的序列化程序并尝试过: 我使用来自的以下代码对JSON进行了序列化: 但是我得到这个错误: 如何在Jackson上使用自定义序列化程序? 这就是我对Gson的处理方式: 但是我现在需要和Jackso
我有下面的JSON,我正试图使用Jackson API反序列化它 我基本上需要一个附件类,它有一个AttachmentFile对象列表,如下所示: 如何使用自定义反序列化器实现这一点? 谢谢
下面的代码再现了这个问题: 上面的代码不做其他注册“自定义”序列化程序的事情(只是委托回原始序列化程序),但它生成的JSON没有null属性: {“第一个”:“鲍勃”,“最后一个”:“巴克”} 我读过许多看似相关的SO文章,但没有一篇能让我找到解决方案。我尝试在序列化时显式地将映射器设置为,但没有成功。 我唯一的线索是JavaDoc for JsonSerializer中的一条注释: 注意:永远不
我试图创建会影响序列化值的自定义jackson注释。 意思是: 现在序列化对象X(10)将导致: 我怎样才能做到这一点?