如何使用jackson序列化瞬态字段?

时间:2013-01-13 12:36:38

标签: java json serialization jackson

我们使用Jackson的JSON序列化来公开系统的内部状态以调试属性。

默认情况下,jackson不会序列化瞬态字段 - 但我也希望将它们序列化。 如何序列化这些字段?

我知道的一种方法是为这些字段提供getter - 但我不想这样做,因为我有一些我不想被调用的getX方法(例如,有一些getter,改变对象状态。)

我知道我可以创建一个注释,但我真的想避免它。

所以我的问题是: 有没有办法设置杰克逊序列化所有对象字段?包括短暂的。

4 个答案:

答案 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 字段的默认行为。