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

pexxcrt2  于 2022-11-06  发布在  其他
关注(0)|答案(2)|浏览(201)

我有两个实体:OneToMany关系中的OrderItem。项目属于订单,而订单有一组项目。

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支持这个特性吗?或者我可以在序列化过程中排除这个字段吗?
我已经在Item上尝试了FetchType.LAZY,并在onLoad() Interceptor中捕获Item,并将其id_order设置为null。但它不起作用。我正在尝试避免编写自定义适配器或在每次查询时手动解析所有订单中的所有项目。

fxnxkyjh

fxnxkyjh1#

我相信它与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

8hhllhi2

8hhllhi22#

我知道这不能直接回答这个问题,但可能会帮助其他人,GSON有一个选项,以排除基于一个变量修饰符。
创建一个新的数据库,并在其中添加一个修改器。

相关问题