json - jackson /GSON : Selecting a different representation when object has been reached via a relationship

标签 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}
}

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

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

谢谢你。

最佳答案

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

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

关于json - jackson /GSON : Selecting a different representation when object has been reached via a relationship,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6110105/

相关文章:

javascript - 在 JavaScript 中拆分定界字符串与 JSON 解析效率

javascript - 使用 JSON.parse 解析 MongoDB 查询字符串

Laravel 模型 : query from multiple array

java - 属性 "thenComparing": 的 setter 定义冲突

java - 创建 JsonProcessingException

java - 什么是 @JsonTypeInfo 和 @JsonSubTypes 在 jackson 中的用途

javascript - Javascript/Angularjs 中数字的平均值

json - 从whattomine中的链接接收JSON数据而不抓取HTML

php - 删除商店标签之前的所有标签

php - 来自外部源的 Laravel Eloquent 无表数据