【问题标题】:jackson serialise to json excluding type杰克逊序列化为 json 不包括类型
【发布时间】:2012-01-02 11:52:43
【问题描述】:

我正在使用休眠来懒惰地从数据库中检索内容。 然后将此内容序列化为json输出,问题是杰克逊在我从休眠中获得的“persistentBag”上调用getter,以“没有会话或会话已关闭”异常结束。

事实上我想告诉杰克逊“如果一个列表没有被加载(意味着如果它是一个persistentBag)那么不要序列化它”

实现这一目标的最佳方法是什么?任何杰克逊配置从序列化中排除persistentBag? 我应该使用反射 api 将 persistentBag 设置为新的空列表吗?

什么是最好的?谢谢大家,新年快乐!

【问题讨论】:

    标签: java hibernate reflection jackson


    【解决方案1】:

    您可以尝试使用@JsonIgnore 完全忽略标记的属性。注释方面,我认为没有“如果加载”选项。

    您当然可以编写自己的编组器来检查类型并决定如何进行。

    我有例如为自定义数据类型编写了一个序列化器

    public class PropertyValueSerializer extends JsonSerializer<PROPERTY_VALUE> {
    
        @Override
        public void serialize(PROPERTY_VALUE property_value, JsonGenerator jsonGenerator,
                              SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
    
            jsonGenerator.writeStartObject();
            jsonGenerator.writeFieldName(property_value.getKey());
            jsonGenerator.writeString(property_value.getValue());
            jsonGenerator.writeEndObject();
        }
    }
    

    然后通过添加一些注释来序列化该类型:

    @JsonSerialize(using = PropertyValueSerializer.class)
    @JsonDeserialize(using = PropertyValueDeserializer.class)
    public class PROPERTY_VALUE implements Serializable{
    
        private String key;
        private String value;
    

    该自定义序列化程序可让您完全控制,但实现起来当然比简单的注释要多一些工作。

    【讨论】:

    • 感谢您的回答。如果我理解得很好,我必须使用 key 和 value 属性制作我自己的 persistentBag。我需要自己获取数据库结果而不是休眠持久化包(不知道是否可能没有深度破解)。然后我可以在我的自定义编组器中指定如何处理序列化过程。
    • 我想知道使用反射是不是更容易,因为我不知道如何使用我调整过的 persistentBag 进行休眠
    • 不,您不会制作自己的持久包,而是为其中具有持久包的类型编写自定义序列化程序,以便您可以检查它们是否可以被访问并因此被序列化。
    【解决方案2】:

    我会首先研究Jackson Hibernate module,因为它增加了对一些特定于 Hibernate 的支持,例如处理延迟加载。 它还可以扩展为允许禁用尚未加载的集合的输出,因为它已经知道如何在需要时延迟加载集合。

    另外,一般来说,您可以通过使用来防止空集合的输出

    @JsonSerialize(include=JsonSerialize.Inclusion.NON_EMPTY)
    

    当且仅当它具有至少一个元素时才会添加匹配属性。

    【讨论】:

    • 这是一个很好的提示,但它必须以某种方式调用 Collection.isEmpty。我不想要这个,因为我的休眠会话已经消失并导致异常。不过还是很高兴知道,谢谢
    • 好的。是的,它需要一种或另一种形式的空性知识,所以这可能是有问题的。
    猜你喜欢
    • 2021-12-02
    • 1970-01-01
    • 2018-06-21
    • 2015-04-07
    • 2015-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-16
    相关资源
    最近更新 更多