如何解决更改对象的特定注释字段的值,该对象用作某些对象中多个字段的类型 - Jackson Object Mapper Serialize
我有一个 Person 类:
public class Person {
private String name;
private String address;
}
现在这个 Person 类在另一个类中被用作:
public class Group {
private Person nicePerson;
private Person badPerson;
private Person secretPerson;
}
现在,我想使用 Jackson ObjectMapper 将我的 Group 对象序列化为 JSON。我正在使用基于一些注释的自定义序列化程序。
当我序列化 Group 对象时,我正在寻找以下输出:
{
"nicePerson": {
"name": "John","address": "usa"
},"badPerson": {
"name": "Harold","address": "canada"
},"secretPerson": {
"name": "XXXXXXX","address": "london"
}
}
这里,我想把'secretPerson'的名字改成“XXXXXXX”。
但是我遇到了一些问题。
我做了以下注释:
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.FIELD})
public @interface SecretInfo {
String maskedValue = "XXXXXXX";
String value() default maskedValue;
}
我按照以下方式注释了我的 Person 类:
public class Person {
@SecretInfo
private String name;
private String address;
}
我制作了以下序列化程序,用于查找此注释,然后更改值。为方便起见,它现在使用了一些泛型。
public class SecretInfoSerializer<T> extends StdSerializer<T> implements ContextualSerializer {
private SecretInfo secretInfo;
public SecretInfoSerializer() {
super((Class<T>) String.class);
}
public SecretInfoSerializer(SecretInfo secretInfo,JavaType clazz) {
super(clazz);
this.secretInfo = secretInfo;
}
@Override
public void serialize(T value,JsonGenerator jsonGenerator,SerializerProvider serializerProvider) throws IOException {
if (secretInfo != null && value != null) {
jsonGenerator.writeString(secretInfo.value());
} else jsonGenerator.writeString(getValue(value));
}
@Override
public JsonSerializer<?> createContextual(SerializerProvider serializerProvider,BeanProperty property) {
if (property != null) {
return new SecretInfoSerializer<>(
property.getAnnotation(SecretInfo.class),property.getType());
} else {
return new SecretInfoSerializer<>();
}
}
private String getValue(T value) {
if (value == null) {
return "null";
} else {
return value.toString();
}
}
}
我已将其与 Annotation Introspector 相关联并制作了 ObjectMapper。 然后我在上面序列化了我的“组”类。但我得到以下输出:
{
"nicePerson": {
"name": "XXXXXXX","badPerson": {
"name": "XXXXXXX","address": "london"
}
}
如您所见,由于我在 Person 类中注释了 'name' 字段,所以每个 Person 类都会得到“XXXXXXX”。但这不是我想要的。我只想更改“secretPerson”的值。
我不知道该怎么办:
也许有如下方式:
public class Group {
private Person nicePerson;
private Person badPerson;
@HasSecretInfo
private Person secretPerson;
}
然后序列化程序会检查它是否@HasSecretInfo
,然后才查找@SecretInfo
...等。像这样的东西。
所以我想解决这个问题。如果您有任何解决方案,那就太好了。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。