gpt4 book ai didi

java - gson序列化时如何排除字段

转载 作者:行者123 更新时间:2023-11-29 05:00:14 30 4
gpt4 key购买 nike

我有两个实体:OrderItemOneToMany 关系中。 Item属于一个Order,Order有一组Items。

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() 拦截器 中捕获 Item 并设置它的 id_ordernull。但它没有用。我试图避免在每次查询时编写自定义适配器或手动解析所有订单中的所有项目。

最佳答案

我相信它与 Hibernate 的关系不大,但与 GSON 的关系更多。您应该定义序列化/反序列化规则。

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

@Expose(serialize = false, deserialize = false)

另一种方法是为给定类定义自定义适配器。使用适配器,您可以完全覆盖 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 实例的适配器,使用纯实例和手动序列化/反序列化添加一个字段。

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

关于java - gson序列化时如何排除字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32352585/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com