How to control Jackson serialization of a library class
我有一个类(我们称它为
由于这显然是多余的,所以我希望控制序列化,并且只序列化那些主要成员。我是否可以向类中写入一些注释来控制类型不在我控制范围内的成员的序列化,或者为这些成员编写一些自定义序列化程序?
我可能可以为
我不想修改
可以使用mixin来确保类是根据需要序列化的。考虑以下内容:
1 2 3 4 5 6 7 | // The source class (where you do not own the source code) public class ColorRGBA { public float a; // <-- Want to skip this one public float b; public float g; public float r; } |
然后,在忽略
1 2 3 4 5 | // Create a mixin where you ignore the"a" property @JsonIgnoreProperties("a") public abstract class RGBMixin { // Other settings if required such as @JsonProperty on abstract methods. } |
。
最后,使用mixin配置映射器:
1 2 3 | ObjectMapper mapper = new ObjectMapper(); mapper.addMixInAnnotations(ColorRGBA.class, RGBMixin.class); System.out.println(mapper.writeValueAsString(new ColorRGBA())); |
输出将是:
{"b":0.0,"g":0.0,"r":0.0}
号
请注意,方法
1 | mapper.addMixIn(ColorRGBA.class, RGBMixin.class); |
。
JavaDocs可以在这里找到
方案A
如果控制类的源代码,则可以将其放在上面的类中:
1 2 | @JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE) public class ColorRGBA { |
选项B
否则,可以设置对象映射器以忽略getter:
1 2 3 4 5 6 7 8 | ObjectMapper mapper = new ObjectMapper(); mapper.setVisibilityChecker(mapper.getSerializationConfig().getDefaultVisibilityChecker() .withFieldVisibility(JsonAutoDetect.Visibility.ANY) .withGetterVisibility(JsonAutoDetect.Visibility.NONE) .withSetterVisibility(JsonAutoDetect.Visibility.NONE) .withCreatorVisibility(JsonAutoDetect.Visibility.NONE)); mapper.writeValue(stream, yourObject); |
号选项C
对于更复杂的需求,您可以编写自己的VisibilityChecker实现。
可以只为成员编写自定义序列化程序,对成员使用如下注释:
1 2 | @JsonSerialize(using = CustomColorRGBASerializer.class) ColorRGBA color; |
。
另请参见有关如何自定义序列化日期字段的回答。