繁体   English   中英

如何控制库类的 Jackson 序列化

[英]How to control Jackson serialization of a library class

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

由于这显然是多余的,我想控制序列化并仅序列化那些主要成员。 是否有一些注释可以写入我的类来控制类型不受我控制的成员的序列化,或者它们的一些自定义序列化器?

我可能可以为Piece类编写一个自定义序列化程序,尽管除了ColorRGBA序列化程序过于冗长之外,默认序列化对Piece所有其他属性都适用,因此我想尽可能少地自定义它。

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

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

// 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。

// 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 可以在这里找到

选项 A

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

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

选项 B

否则,您可以设置一个对象映射器来忽略 getter:

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

可以只为成员编写自定义序列化程序,使用成员的注释,如下所示:

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

另请参阅有关如何自定义序列化日期字段的答案

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM