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

如何有条件地序列化一个字段

郭璞
2023-03-14

我想有条件地序列化一个字段。我想出了如何有条件地忽略带有

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 ***>");
    }
}

所以我想做的是把它们结合起来。因此,如果一个字段有特殊的注释,并且我正在使用我的内省器,只有在那时,我才想编辑该字段。否则,该字段应正常序列化。

共有1个答案

阎单鹗
2023-03-14

而不是覆盖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