关于java:如何控制Jackson类的序列化

How to control Jackson serialization of a library class

我有一个类(我们称它为Piece)包含com.jme3.math.ColorRGBA类型的成员。使用默认的Jackson序列化,成员不仅作为其成员rgba序列化,还使用getAlpha等getter。

由于这显然是多余的,所以我希望控制序列化,并且只序列化那些主要成员。我是否可以向类中写入一些注释来控制类型不在我控制范围内的成员的序列化,或者为这些成员编写一些自定义序列化程序?

我可能可以为Piece类编写自定义序列化程序,尽管除了colorrgba序列化程序过于冗长之外,默认序列化对于我来说对于Piece的所有其他属性都很好,因此我希望尽可能少地自定义它。

我不想修改jme3库源,解决方案应该在ColorRGBA类之外实现。


可以使用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;
}

然后,在忽略a属性的地方创建mixin。

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}

请注意,方法ObjectMapper.addMixInAnnotations已从jackson 2.5中弃用,应替换为更流畅的版本:

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;

另请参见有关如何自定义序列化日期字段的回答。