如何控制库的 Jackson 序列化 class

How to control Jackson serialization of a library class

我有一个 class(我们称它为 Piece),其中包含一个 com.jme3.math.ColorRGBA 类型的成员。使用默认的 Jackson 序列化,成员不仅被序列化为其成员 rgba,而且还使用像 getAlpha 这样的吸气剂。

因为这显然是多余的,所以我想控制序列化并只序列化那些主要成员。是否有一些注释可以写到我的 class 中以控制类型不受我控制的成员的序列化,或者为它们使用一些自定义序列化程序?

我或许可以为 Piece class 编写自定义序列化程序,但除了 ColorRGBA 序列化程序过于冗长之外,默认序列化对我来说适用于 [的所有其他属性=11=],因此我想尽可能少地定制它。

我不想修改jme3库源,解决方案应该在ColorRGBAclass.

之外实现

选项 A

如果你控制了class的来源,可以把这个放在上面class:

@JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE)
public class ColorRGBA {

选项 B

否则你可以设置一个对象映射器来忽略 getters:

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实现。

您可以使用 mixin 来确保 class 根据您的需要进行序列化。考虑以下因素:

// 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 属性.

的地方创建混入
// 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 配置映射器:

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 中弃用,应替换为更流畅的版本:

mapper.addMixIn(ColorRGBA.class, RGBMixin.class);

JavaDocs 可以是 found here

可以只为成员编写一个自定义序列化程序,像这样为成员使用注释:

@JsonSerialize(using = CustomColorRGBASerializer.class)
ColorRGBA color;

另见 this answer about how to custom-serialize a Date field