7

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

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

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

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

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

4

4 回答 4

12

我对 Jackson 2.4.3 的解决方案:

  private static final ObjectMapper mapper =
        new ObjectMapper(){{

            Hibernate4Module module = new Hibernate4Module();
            module.disable(Hibernate4Module.Feature.USE_TRANSIENT_ANNOTATION);
            registerModule(module);

        }};
于 2015-03-17T21:12:34.753 回答
7

我认为杰克逊不支持任何类型的配置来使其能够序列化瞬态字段。添加该功能有一个未解决的问题,但它已经过时并且尚未解决(据我所知):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”约定命名它并返回一些东西。

于 2013-01-13T14:04:54.230 回答
0

您可以为该瞬态字段创建自定义 getter 并使用 @XmlElement 属性。那个吸气剂的名字并不重要。

例如:

public class Person {

     @XmlTransient private String lastname;

     @XmlElement(name="lastname")
     public String getAnyNameOfMethod(){
         return lastname;
     }

}
于 2014-09-19T14:39:48.403 回答
0

让 Jackson 序列化属性的另一种方法是在@JsonProperty其上方添加注释。我想这是更好的方法,因为您不需要禁用所有@Transient字段的默认行为,就像 Gere 的回答一样。

于 2021-02-10T15:35:28.800 回答