如果我有这门课程:
class Person {
int id;
String name;
String displayName;
int age;
// getters and setter, constructors, equals, hashcode, toString...
}
我将相同的对象传递给name
和displayName
String name = "abcdefg";
Person person = new Person(1, name, name, 54);
当我序列化为JSON时,我会得到
{"id":1,"name":"abcdefg","displayName":"abcdefg","age":54}
哪个丢失了参考数据。我想要像
这样的东西{"id":1,"name":"abcdefg","displayName":name,"age":54}
表示它们是相同的。
我怎么能这样做(最好是杰克逊)?
答案 0 :(得分:0)
简单地说,你不能。您可以序列化对象,但不能序列化它们的引用。但是,如果你打算实现这一点,你可以放一个特殊字符后跟一个参数名称,当你读取json时,你可以按照以下步骤操作:
检查值是否以特殊字符开头,例如$(因此displayName的值可以是$ name)
如果是,则值的其余部分实际上是要将其值复制到变量中的变量(在本例中,名为“name”的变量)
使用反射,您可以获得引用变量的值,并将其值存储在当前变量中。 (在运行时,将name的值复制到displayName中)
但是,我强烈反对。
编辑回应提出的问题'人们如何应对JSON规模增加'
人们处理数据库的方式相同。它们不是保存对象,而是将id分配给不同的对象并引用id而不是将整个对象序列化为另一个对象。
例如,您有播放器,广告资源和项目类。玩家拥有库存。库存可以有n个项目。因此,在序列化玩家的库存时,您需要为每个项目分配ID,而在库存中,您只需要放置项目的ID。
是的,根据要求,JSON的大小可能会变得非常大。
答案 1 :(得分:0)
鉴于您已经公开了一些REST服务,如果您关注JSON的大小,您可以选择使用基于HATEOAS的方法。您只需添加指向这些对象的链接,而不是在初始响应中捆绑所有复杂对象,这样您就可以在之后获取它们; e.g。
{
"price": 400,
"description": "Chromebook device",
"name": "Chromebook",
"_links": [
{
"rel": "self",
"href": "http://localhost:8080/products/1"
},
{
"rel": "product.manufacturer",
"href": "http://localhost:8080/manufacturers/18"
}
]
}
这里发生的是,不是立即编组制造商,而是在需要时提供一种获取方式。