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

我有一个大的对象图,我希望通过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}

在序列化给定的Person时,我需要的结果是:

{"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公开对象图中的对象时,其他人会怎么做.

谢谢.

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

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

点赞