如何控制Jackson类的库序列化

时间:2015-01-27 14:19:39

标签: java serialization jackson

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

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

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

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

3 个答案:

答案 0 :(得分:15)

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

然后,创建mixin,忽略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配置您的mapper:

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

答案 1 :(得分:1)

选项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实施。

答案 2 :(得分:0)

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

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

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