我们使用Jackson的JSON序列化来公开系统的内部状态以调试属性。
默认情况下,jackson不会序列化瞬态字段 - 但我也希望将它们序列化。 如何序列化这些字段?
我知道的一种方法是为这些字段提供getter - 但我不想这样做,因为我有一些我不想被调用的getX方法(例如,有一些getter,改变对象状态。)
我知道我可以创建一个注释,但我真的想避免它。
所以我的问题是: 有没有办法设置杰克逊序列化所有对象字段?包括短暂的。
答案 0 :(得分:11)
我与Jackson 2.4.3的解决方案:
private static final ObjectMapper mapper =
new ObjectMapper(){{
Hibernate4Module module = new Hibernate4Module();
module.disable(Hibernate4Module.Feature.USE_TRANSIENT_ANNOTATION);
registerModule(module);
}};
答案 1 :(得分:7)
我认为Jackson不支持任何类型的配置,以使其能够序列化瞬态字段。添加该功能有一个悬而未决的问题,但它已经过时并且尚未得到解决(据我所知):http://jira.codehaus.org/browse/JACKSON-623
所以我的问题是:有没有办法设置杰克逊序列化所有 对象字段?包括短暂的。
所以回答你的问题,不。
其他一些Java JSON工具(如GSON )支持配置选项以序列化瞬态字段。如果您可以使用其他工具,您可以查看(对于GSON,请参阅:https://sites.google.com/site/gson/gson-user-guide)。
要扩展一点,您可以尝试不同的方法。
首先,您不应该尝试序列化瞬态字段。在瞬态的所有定义之后是“不要序列化这个”。不过,我可以想到一些可能需要的特定情况,或者至少方便(比如使用代码时无法修改等)。尽管如此,在99%的案例中,答案是不这样做。如果需要序列化,请更改字段,使其不是瞬态的。如果您有多个使用相同字段的上下文,并且您希望将其序列化为一个(例如JSON),而不是另一个(例如java.io)中的序列化,那么您应该为这种情况创建自定义序列化程序你不想要它,而不是滥用关键字。
其次,关于使用getter并使用“一些改变对象状态的getter”,你应该尽量避免使用它。这可能会导致各种意想不到的后果。而且,从技术上讲,这不是一个吸气剂,那是一个制定者。我的意思是,如果它改变状态,你有一个mutator(setter)而不是accessor(getter),即使你按照“get”约定命名并返回一些东西。
答案 2 :(得分:0)
您可以为该瞬态字段创建自定义getter并使用@XmlElement属性。这个吸气剂的名字并不重要。
例如:
public class Person {
@XmlTransient private String lastname;
@XmlElement(name="lastname")
public String getAnyNameOfMethod(){
return lastname;
}
}
答案 3 :(得分:0)
另一种让 Jackson 序列化属性的方法是在其上方添加 @JsonProperty
注释。
我想这是更好的方法,因为您不需要像 Gere 的回答那样禁用所有 @Transient
字段的默认行为。