Jackson序列化为json,不包括类型



我正在使用hibernate从数据库中惰性检索内容。这个内容然后序列化到json输出,问题是,杰克逊调用getter上的"persistentBag"我从hibernate获得,以"无会话或会话被关闭"异常结束。

事实上,我想告诉jackson"如果一个列表没有加载(意味着如果它是一个persistentBag),那么不要序列化它"

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

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

您可以尝试使用@JsonIgnore完全忽略标记的属性。注释方面,我不认为有一个"if loaded"选项。

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

例如,我为自定义数据类型 编写了一个序列化器。
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;

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

我将首先研究Jackson Hibernate模块,因为它增加了对一些Hibernate特有的东西的支持,比如延迟加载的处理。它还可以扩展为允许禁用未加载集合的输出,因为它已经知道如何在需要时惰性加载集合。

此外,通常您可以使用

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

,当且仅当它包含至少一个元素时,它将添加匹配属性。

相关内容

  • 没有找到相关文章

最新更新