繁体   English   中英

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

[英]How to exclude fields during serialization of gson

我有两个实体: OneToMany关系中的OrderItem 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,以避免传播。 休眠是否支持此功能? 或者我可以在序列化期间排除该字段吗?

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

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

我知道这并不能直接回答问题,但可能会帮助其他人,GSON 可以选择基于变量修饰符进行排除。

Gson gson = new GsonBuilder().excludeFieldsWithModifiers(Modifier.PRIVATE).create();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM