【问题标题】:How to exclude fields during serialization of gson如何在gson序列化期间排除字段
【发布时间】:2015-09-02 11:59:55
【问题描述】:

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

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

【问题讨论】:

    标签: java hibernate gson


    【解决方案1】:

    我相信 Hibernate 没有太多,但 GSON 更多。您应该定义序列化/反序列化规则。

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

    @Expose(serialize = false, deserialize = false)
    

    另一种方法是为 givem 类定义自定义适配器。使用 Adapter,您可以完全覆盖 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

    【讨论】:

    • 看来@Expose 是我想要的,但是,它需要@excludeFieldsWithoutExposeAnnotation,这需要我将@Expose 添加到所有实体的所有字段(很多)。除了我指定 serialize=false 的字段之外,有什么方法可以自动公开所有字段?
    • 是的,您可以使用 ExclusionStrategy:google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/com/…
    • 我采用了排除策略。易于使用且非常实用。谢谢,请将其添加到未来读者的答案中。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-04-16
      • 1970-01-01
      • 2012-10-13
      • 2016-12-29
      • 1970-01-01
      • 1970-01-01
      • 2018-01-13
      • 2019-09-06
      • 2021-08-25
      相关资源
      最近更新 更多