簡體   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