我想有条件地序列化一个字段。我想出了如何有条件地忽略带有
public class NologIntrospector extends JacksonAnnotationIntrospector {
@Override
public boolean hasIgnoreMarker(AnnotatedMember m) {
boolean noLogOnClass = m.getDeclaringClass().getAnnotation(NoLog.class) != null;
return m.hasAnnotation(NoLog.class) || super.hasIgnoreMarker(m) || noLogOnClass;
}
}
但我真正想做的是编辑字段。所以如果我有
@Getter
@Setter
@NoArgsConstructor
public class MyObject1 {
public String field1 = "field1";
@NoLog
public String field2 = "field2";
public static void main(String[] args) throws JsonProcessingException {
final ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setAnnotationIntrospector(new NologIntrospector());
final MyObject1 myObject1 = new MyObject1();
System.out.println(objectMapper.writeValueAsString(myObject1));
}
}
我明白了
{"field1":"field1"}
字段2被正确忽略。但我真正想要的是
{"field1":"field1", "field2": "<***redacted***>"}
我还有一个注释,@MaskSensitiveData
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotationsInside
@JsonSerialize(using = MaskSensitiveDataSerializer.class)
public @interface MaskSensitiveData {
}
public class MaskSensitiveDataSerializer extends StdSerializer<Object> {
protected MaskSensitiveDataSerializer() {
this(null);
}
public MaskSensitiveDataSerializer(Class<Object> t) {
super(t);
}
@Override
public void serialize(Object value, JsonGenerator gen, SerializerProvider provider) throws IOException {
if (!(value instanceof String)) {
throw new RuntimeException("MaskSensitiveData annotation is only valid for string");
}
gen.writeString("<*** redacted ***>");
}
}
所以我想做的是把它们结合起来。因此,如果一个字段有特殊的注释,并且我正在使用我的内省器,只有在那时,我才想编辑该字段。否则,该字段应正常序列化。
而不是覆盖NologIntrospector
中的方法hasIgnoreMarker
。您需要覆盖findSerializer
。这样,当您的内窥镜检查器启用时,将使用自定义序列化程序,否则将使用原始序列化程序。
public class NologIntrospector extends JacksonAnnotationIntrospector {
@Override
public Object findSerializer(Annotated ann){
if (ann.hasAnnotation(NoLog.class)) {
return MaskSensitiveDataSerializer.class;
}
return super.findSerializer(ann);
}
}
我想要的是有条件地为类的对象使用默认BeanSerializer: 我曾经尝试过做这样的事情: 但是这调用MyCustomSerializer的方法,我有永无止境的递归。我怎么能得到适当的序列化对象,我可以用普通bean序列化?
我有一门课像 我想在我的Web服务中序列化IHideable列表;但是过滤掉任何将隐藏字段设置为true的对象。 基本上给出了一个物体列表,比如 我希望输出为 我尝试了以下实现 但是编写的writeString方法是特定于Address类的。当我在那里使用writeObject时,它抛出stackoverflow异常。我可以使用一些通用writeObject方法来编写实现IHideable()的任
我是solr的新手,当我试图在Solr中序列化/反序列化一个Map时,我遇到了一个问题。 我在Java应用程序中使用Spring Data Solr,如下所示: 它在Solr中展平并序列化我地图,如下所示: 但是,当我运行搜索时,返回的对象始终将此字段设置为 NULL。反序列化不适用于此特定字段,看起来它无法识别键 1、键 2...作为地图的一部分。 有人知道如何使派生工作吗?我必须实现自定义转换
问题内容: 我已经奋斗了几个小时,没有取得好结果。我正在尝试使用.NET JSON序列化程序将JSON从UI来回转换为对象。 小数引起了问题,因为我的文化的标准使用“,”作为小数分隔符而不是“。”。我尝试实现自定义转换器,但效果不佳。 我还检查了NewtonSoft JSON.net,但没有得到更好的结果。到目前为止,似乎与值类型的匹配是文化不变的。我要覆盖此行为,该怎么办? 顺便说一句,我真的很
问题内容: 我的直觉告诉我,必须以某种方式将其转换为字符串或byte [](在Go中甚至可能是相同的东西?),然后将其保存到磁盘。 我找到了这个包(http://golang.org/pkg/encoding/gob/),但似乎仅用于结构? 问题答案: 序列化数据有多种方法,Go为此提供了许多软件包。某些常见编码方式的软件包: 处理地图很好。以下示例显示了地图的编码/解码: 操场
我需要以某种方式储存这些东西。写这样一个大的trie文件需要大量的时间。而unserialize中的file_get_contents将导致整个文件加载到内存中。 我需要使用二进制文件而不是txt文件吗?怎么做? 我还了解了3种存储技术:serialize、json_encode、var_export