我们使用 JSON 序列化和 Jackson 来公开系统的内部状态以调试属性。
默认情况下,杰克逊不序列化瞬态字段 - 但我也希望序列化它们。如何序列化这些字段?
我知道的一种方法是为这些字段提供吸气剂 - 但我不想这样做,因为我有一些我不想被调用的 getX 方法(例如,有一些吸气剂会改变对象状态 )。
我知道我可以创建一个注释,但我真的想避免它。
所以我的问题是:有没有办法设置杰克逊来序列化所有对象字段?包括瞬态的。
我们使用 JSON 序列化和 Jackson 来公开系统的内部状态以调试属性。
默认情况下,杰克逊不序列化瞬态字段 - 但我也希望序列化它们。如何序列化这些字段?
我知道的一种方法是为这些字段提供吸气剂 - 但我不想这样做,因为我有一些我不想被调用的 getX 方法(例如,有一些吸气剂会改变对象状态 )。
我知道我可以创建一个注释,但我真的想避免它。
所以我的问题是:有没有办法设置杰克逊来序列化所有对象字段?包括瞬态的。
我对 Jackson 2.4.3 的解决方案:
private static final ObjectMapper mapper =
new ObjectMapper(){{
Hibernate4Module module = new Hibernate4Module();
module.disable(Hibernate4Module.Feature.USE_TRANSIENT_ANNOTATION);
registerModule(module);
}};
我认为杰克逊不支持任何类型的配置来使其能够序列化瞬态字段。添加该功能有一个未解决的问题,但它已经过时并且尚未解决(据我所知):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”约定命名它并返回一些东西。
您可以为该瞬态字段创建自定义 getter 并使用 @XmlElement 属性。那个吸气剂的名字并不重要。
例如:
public class Person {
@XmlTransient private String lastname;
@XmlElement(name="lastname")
public String getAnyNameOfMethod(){
return lastname;
}
}
让 Jackson 序列化属性的另一种方法是在@JsonProperty
其上方添加注释。我想这是更好的方法,因为您不需要禁用所有@Transient
字段的默认行为,就像 Gere 的回答一样。