考虑一个案例,我有2个对象映射器实例。我希望必须从序列化中排除使用某些自定义注释注释的字段,而其他映射器包含(忽略注释)
就像类有3个字段a,b,c和c用一些注释注释(比如@IgnoreField)(它们的n个类,每个类都有它们不应该被序列化的字段)
现在,第一个对象映射器 o1 必须仅序列化 a 和 b。而第二个对象映射器o2可以序列化a,b和c。
任何具有不同字段的类都可能发生这种情况,其中一些字段可能带有注释。
一个明显的不回答:
这很可能是一个糟糕的想法。
你写代码来表达你的意图。当您使用该注释时,您是在告诉“每个人”应该忽略这些字段。
人类读者可能会花半天时间问自己“它说a
和c
@IgnoreField
,那么为什么是a
,c
会出现序列化数据?
换句话说,无论你在这里试图解决什么问题,答案很可能不是通过黑客攻击你的方式忽略注释。
下一个最好的“合理”解决方案可能是:依赖不同的自定义注释,如@IgnoreAlways
和类似@OnlyIncludeForXyz
。换句话说:清楚地表达可能发生的事情。而不是使用声明式编程,然后对你声明的内容“撒谎”。
尝试为不同的条件配置 SimpleBeanPropertyFilter。
@JsonFilter("someBeanFilter")
public class SomeBean {
}
SimpleFilterProvider filterProvider = new SimpleFilterProvider();
filterProvider.addFilter("someBeanFilter",SimpleBeanPropertyFilter.serializeAllExcept("aFild"));
ObjectMapper mapper = new ObjectMapper();
mapper.setFilterProvider(filterProvider);
您始终可以实现自定义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原语值序列化块引号 我是否使用