当前位置: 首页 > 知识库问答 >
问题:

自定义注释基于序列化中的忽略字段

袁建木
2023-03-14

考虑一个案例,我有2个对象映射器实例。我希望必须从序列化中排除使用某些自定义注释注释的字段,而其他映射器包含(忽略注释)

就像类有3个字段a,b,c和c用一些注释注释(比如@IgnoreField)(它们的n个类,每个类都有它们不应该被序列化的字段)

现在,第一个对象映射器 o1 必须仅序列化 a 和 b。而第二个对象映射器o2可以序列化a,b和c。

任何具有不同字段的类都可能发生这种情况,其中一些字段可能带有注释。

共有3个答案

咸亦
2023-03-14

一个明显的不回答:

这很可能是一个糟糕的想法。

你写代码来表达你的意图。当您使用该注释时,您是在告诉“每个人”应该忽略这些字段。

人类读者可能会花半天时间问自己“它说ac@IgnoreField,那么为什么是ac会出现序列化数据?

换句话说,无论你在这里试图解决什么问题,答案很可能不是通过黑客攻击你的方式忽略注释。

下一个最好的“合理”解决方案可能是:依赖不同的自定义注释,如@IgnoreAlways类似@OnlyIncludeForXyz。换句话说:清楚地表达可能发生的事情。而不是使用声明式编程,然后对你声明的内容“撒谎”。

轩辕海
2023-03-14

尝试为不同的条件配置 SimpleBeanPropertyFilter。

@JsonFilter("someBeanFilter")
public class SomeBean {
}

SimpleFilterProvider filterProvider = new SimpleFilterProvider();
filterProvider.addFilter("someBeanFilter",SimpleBeanPropertyFilter.serializeAllExcept("aFild")); 

ObjectMapper mapper = new ObjectMapper();
mapper.setFilterProvider(filterProvider); 
梁丘俊材
2023-03-14

您始终可以实现自定义JsonSerializer并将其注册到您的ObjectMapper。

class Bean {
    @Ignore
    String a;
    String b;
}

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@interface Ignore {

}

class BeanWithIgnoredFieldsSerializer extends JsonSerializer<Bean> {

    @Override
    public void serialize(final Bean value, final JsonGenerator gen, final SerializerProvider serializers) throws IOException, JsonProcessingException {
        gen.writeStartObject();
        try {
            for (final Field f : Bean.class.getFields()) {
                if (f.isAnnotationPresent(Ignore.class)) {
                    gen.writeStringField(f.getName(), (String) f.get(value));
                }
            }
        } catch (final Exception e) {
            //
        }
        gen.writeEndObject();
    }

}

class BeanModule extends SimpleModule {

    BeanModule() {
        addSerializer(Bean.class, new BeanWithIgnoredFieldsSerializer());
    }
}

void configure(final ObjectMapper om) {
    om.registerModule(new BeanModule());
}

注意,我没有测试这段代码,但这就是如何向OM添加自定义序列化程序的一般思路。根据需要调整序列化方法中的代码。

 类似资料:
  • 根据这个答案:https://stackoverflow.com/a/43342675/5810648 我编写了这样的序列化程序: 如果注释存在并且字段为,则Witch应该编写字符串“N/A”。但是方法仅对非空字段调用。 此外,我还尝试调用setNullValueSerializer: 有了这样的实施: 但没有结果。 如何以这种方式处理空字段? 使现代化 根据讨论:https://github.c

  • 我试图创建会影响序列化值的自定义jackson注释。 意思是: 现在序列化对象X(10)将导致: 我怎样才能做到这一点?

  • 例如: 我知道有jackson注解可以这样做,但是我的字段已经用我的持久性注解进行了注解,所以我想避免重复,因为我已经有了我想忽略的注解的字段

  • 如何使Gson正确序列化我的密钥?

  • 问题内容: 我正在尝试创建将影响序列化值的自定义杰克逊注释。 含义: 现在序列化对象X(10)将导致: 我该如何实现? 问题答案: 结果:

  • 我阅读了Jackson的annotations文档,但是我仍然找不到如何从annotations调用自定义序列化程序来序列化< code>java.sql.Date对象。 但是注释似乎只接受布尔值作为参数,而注释doc则表示: @JsonValue(method):用于标记返回值用作对象序列化的方法;通常用于标记生成字符串的方法(如toString())以生成JSON原语值序列化块引号 我是否使用