如何控制库的 Jackson 序列化 class
How to control Jackson serialization of a library class
我有一个 class(我们称它为 Piece
),其中包含一个 com.jme3.math.ColorRGBA
类型的成员。使用默认的 Jackson 序列化,成员不仅被序列化为其成员 r
、g
、b
和 a
,而且还使用像 getAlpha
这样的吸气剂。
因为这显然是多余的,所以我想控制序列化并只序列化那些主要成员。是否有一些注释可以写到我的 class 中以控制类型不受我控制的成员的序列化,或者为它们使用一些自定义序列化程序?
我或许可以为 Piece
class 编写自定义序列化程序,但除了 ColorRGBA
序列化程序过于冗长之外,默认序列化对我来说适用于 [的所有其他属性=11=],因此我想尽可能少地定制它。
我不想修改jme3
库源,解决方案应该在ColorRGBA
class.
之外实现
选项 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。
我有一个 class(我们称它为 Piece
),其中包含一个 com.jme3.math.ColorRGBA
类型的成员。使用默认的 Jackson 序列化,成员不仅被序列化为其成员 r
、g
、b
和 a
,而且还使用像 getAlpha
这样的吸气剂。
因为这显然是多余的,所以我想控制序列化并只序列化那些主要成员。是否有一些注释可以写到我的 class 中以控制类型不受我控制的成员的序列化,或者为它们使用一些自定义序列化程序?
我或许可以为 Piece
class 编写自定义序列化程序,但除了 ColorRGBA
序列化程序过于冗长之外,默认序列化对我来说适用于 [的所有其他属性=11=],因此我想尽可能少地定制它。
我不想修改jme3
库源,解决方案应该在ColorRGBA
class.
选项 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。