代码之家  ›  专栏  ›  技术社区  ›  Alexandru Severin

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

  •  1
  • Alexandru Severin  · 技术社区  · 11 年前

    我有两个实体: Order 和 Item 在一个 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 并将它们发送到另一台机器,但由于订单和项目都有相互引用,因此在序列化过程中会创建一个循环。

    我的目标是 项目 已加载,字段 id_order 应该是 null 或仅包含id以避免传播。休眠是否支持此功能?或者我可以在序列化期间排除该字段吗?

    我已经试过了 FetchType.LAZY 在…上 项目 和捕捉 项目 内部 onLoad() Interceptor 并设置其 id顺序(_O) 到 无效的 。但它不起作用。我试图避免在每次查询时编写自定义适配器或手动解析所有订单中的所有条目。

    2 回复  |  直到 9 年前
        1
  •  4
  •   kamil    11 年前

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

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

    @Expose(serialize = false, deserialize = false)
    

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

    如果要避免编写整个序列化,可以使用 @暴露 ,然后使用GSON的纯实例编写适配器,使用该纯实例序列化/反序列化并手动添加该字段。

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

        2
  •  0
  •   Christo Naudé    5 年前

    我知道这并不能直接回答这个问题,但可能会对其他人有所帮助,GSON有一个基于vairiables修饰符的排除选项。

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