如何在gson序列化期间排除字段

时间:2015-09-02 11:59:55

标签: java hibernate gson

我有两个实体:OrderItem OneToMany关系。物品属于一个订单,订单有一组物品。

class Order{
     @OneToMany(fetch = FetchType.EAGER, mappedBy = "id_order")
     Set<Item> items;
}

class Item{
     @ManyToOne(targetEntity = Order.class, fetch = FetchType.LAZY)
     @JoinColumn(name = "id_order")
     Order id_order;
}

我使用gson序列化Orders并将它们发送到另一台机器,但是在序列化期间正在创建一个循环,因为订单和项目都相互引用。

我的目标是,当加载Item时,字段id_order应为null或仅包含ID,以避免传播。 hibernate是否支持此功能?或者我可以在序列化期间排除字段吗?

我已在FetchType.LAZY上尝试了Item并在Item内抓取onLoad() Interceptor并将其id_order设置为null。但它没有用。我试图避免编写自定义适配器或在每次查询时手动解析所有订单中的所有项目。

1 个答案:

答案 0 :(得分:3)

我认为它与Hibernate相比并不多,但GSON更多。您应该定义序列化/反序列化规则。

最简单的方法是使用@Expose注释,从序列化/反序列化中包含/排除给定属性:

@Expose(serialize = false, deserialize = false)

另一种方法是为givem类定义自定义适配器。使用适配器,您可以完全覆盖GSON序列化或反序列化对象的方式。

例如:

public class YourAdapter implements JsonDeserializer<Order>, JsonSerializer<Order> {
    @Override
    public Orderde serialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {
    // your logic
    }

    @Override
    public JsonElement serialize(Ordersrc, Type typeOfSrc, JsonSerializationContext context) {
        // your logic
    }
}

最后初始化你的Gson解析器的实例:

Gson gson = new GsonBuilder()
        .registerTypeAdapter(Order.class, new YourAdapter())
        .build();

如果要避免写入整个序列化,可以使用@Expose排除字段,然后使用纯GSON实例编写适配器,使用纯实例序列化/反序列化并手动添加一个字段

处理序列化/反序列化问题的另一种方法是使用此处描述的ExclusionStrategyhttps://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/com/google/gson/ExclusionStrategy.html