【发布时间】:2020-02-20 13:10:15
【问题描述】:
我们使用 jackson 将 java 对象 (DTO) 反序列化为我们的端点的 JSON。这很好用。但是,我有一个奇怪的问题。
假设我们有一个对象用户,我们有附加到这个用户的元数据。元数据实际上可以是客户能想到的任何东西,所以这是非常动态的。
客户端可以发出请求,以检索某个用户的某些元数据属性。假设客户想要拥有以下元数据属性:age 和 favouriteTree(因为有些人有,对吧?关键是,元数据可以是任何东西,而我们事先并不知道这一点)。
我想返回以下 JSON:
{
"userId" : 1,
"age" : 22,
"favouriteTree" : "Maple Tree"
}
我可以简单地拥有一个带有 int userId、int age 和 String favouriteTree 的 Java POJO。这样,我们可以让 Jackson 将其反序列化为 JSON,一切都很好。
但是,下次客户端使用同一个端点时,它可能会请求不同的属性,例如:colorEyes 和 favouriteFood,在这种情况下我想返回:
{
"userId" : 1,
"colorEyes" : "blue",
"favouriteFood" : "Pizza"
}
现在我需要另一个 Java POJO 来处理这些元数据,并按照我们通常的方式对其进行反序列化。但是由于元数据可以是任何东西,我们不能这样做,因为我们不想在我们的代码中不断添加 POJO,因为不同的客户会有不同的需求。
在 Java 中是否有一种通用的方法可以做到这一点?
编辑:
我知道我可以这样做:
{
"userId": 1,
"metadata": [{
"key": "colorEyes",
"value": "blue"
},
{
"key": "favouriteFood",
"value": "Pizza"
}
]
}
但如果可能的话,我想避免这种情况。
【问题讨论】:
-
所以你想退回不同的东西却永远不知道要退回什么?
-
我知道我会根据用户的请求返回什么,但是属性是动态的,所以我不能使用常规 POJO。