杰克逊序列化为json排除类型

时间:2012-01-02 11:52:43

标签: java hibernate reflection jackson

我正在使用hibernate从数据库中懒惰地检索内容。 然后将这个内容序列化为json输出,问题是jackson调用了来自hibernate的“persistentBag”的getter,以“no session or session was closed”异常结束。

事实上,我想告诉杰克逊“如果列表没有加载(意味着它是否是持久化的标签),那么就不要将它序列化”

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

什么是最好的?谢谢你们,祝新年快乐!

2 个答案:

答案 0 :(得分:0)

您可以尝试使用@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;

自定义序列化程序为您提供了完全控制,但实现的工作当然要比简单的注释更多。

答案 1 :(得分:0)

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

此外,通常您可以使用

来阻止输出空集合
@JsonSerialize(include=JsonSerialize.Inclusion.NON_EMPTY)

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

相关问题