Jackson / GSON:通过关系到达对象时选择不同的表示

时间:2011-05-24 12:04:56

标签: json relationship jackson

我有一个大对象图,我希望通过Web服务在RESTful中公开对象。所有对象都具有id属性,该属性用作该类对象中唯一的主键。此外,我的对象图中的所有关系都是双向的。将实例公开为REST资源时,我需要将实例的所有属性写入JSON;但是,我希望通过关系关联的实例仅仅由它们的id表示,而不是将整个对象序列化为JSON。

示例:所以,说一个人有狗,狗有人。

class Person {
  private Integer id;
  private String firstName;
  private String lastName;
  private Dog dog;

  // public getters/setters omitted
}

class Dog {
  private Integer id;
  private String name;
  private Person owner;

  // public getters/setters omitted
}

当序列化给定的狗时,我需要结果:

{"id": 24, "name": "Fifo", "owner": 42}

在序列化给定人员时,我需要结果:

{"id": 42, "firstName": "John", "lastName": "Blogs", "dog": 24}

而不是

{"id": 24, "name": "Fifo", "owner":
  {"id": 42, "firstName": "John", "lastName": "Blogs", "dog": 24}
}

{"id": 42, "firstName": "John", "lastName": "Blogs", "dog":
  {"id": 24, "name": "Fifo", "owner": 42}
}

分别。我在getId()方法中使用了Jackson中的@JsonValue注释,但不幸的是,无论是直接序列化的对象还是通过另一个对象的关系到达对象,它都适用。

我原以为,这个用例相当普遍。如果这是不可能的,那么当通过RESTful API在对象图中公开对象时,其他人会怎么做。

谢谢。

1 个答案:

答案 0 :(得分:2)

我想不出有一个明显的方法可以用Jackson实现这一点(有许多方法可以覆盖功能,因此可能有一种方法可以使用自定义处理程序,但这并不简单),但它听起来像一个引入用户/开发人员列表的好功能;其他人可能已经实施了解决方案,在这里找出一个声明性解决方案会很棒。

实际上我怀疑可以添加类似@JsonKey的注释来处理将单个属性用作键的简单情况。因此功能请求可能有意义。