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

Json Jackson/GSON:通过关系到达对象时选择不同的表示,json,relationship,jackson,Json,Relationship,Jackson,我有一个大的对象图,我想通过web服务在RESTful中公开对象。所有对象都有一个id属性,该属性作为该类对象中唯一的主键。此外,我的对象图中的所有关系都是双向的。当将实例作为REST资源公开时,我需要将实例的所有属性写入JSON;但是,我希望通过关系关联的实例仅由它们的id表示,而不是将整个对象序列化为JSON 比如说,一个人有一条狗,一条狗有一个人 class Person { private Integer id; private String firstName; priva

我有一个大的对象图,我想通过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": 42}
{"id": 42, "firstName": "John", "lastName": "Blogs", "dog": 24}
而不是

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

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

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


谢谢。

对于Jackson,我想不出一个明显的方法来实现这一点(有很多方法可以覆盖功能,所以可能有一种方法可以通过自定义处理程序来实现,但这并不简单),但这听起来是一个很好的功能,可以打开用户/开发人员列表;其他人可能已经实现了解决方案,在这里找到一个声明性的解决方案将是非常棒的


事实上,我怀疑可以添加@JsonKey这样的注释来处理使用单个属性作为键的简单情况。所以一个功能请求可能是有意义的。

这篇文章有什么结果吗?您是否提出了功能请求,或者您是否找到了处理这种情况的方法?我正试图做完全相同的事情,但除了有人说要使用@JsonIgnore或Jackson双向引用注释(这在这种情况下不起作用,因为目标不是在序列化时完全忽略这些字段)之外,我还没有找到太多信息。到目前为止,使用GSON和创建自定义GsonBuilder似乎是我唯一的选择,但我听过很多关于GSON的不太好的意见,我想知道thereAmanda是否会这样做。对不起,不,我还没有想出如何和杰克逊一起做到这一点。我同意,这是一个相当直截了当的特性,我一直在想为什么没有更多的人遇到同样的问题。我可能应该提出一个功能请求,但我没有。我需要生成的JSON相当简单,所以我自己做了,并且完全停止使用Jackson。真遗憾。