如何使用对象引用序列化为JSON而不是复制数据?

时间:2017-05-23 12:34:03

标签: java json jackson

如果我有这门课程:

class Person {

    int id;
    String name;
    String displayName;
    int age;

    // getters and setter, constructors, equals, hashcode, toString...
}

我将相同的对象传递给namedisplayName

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}

表示它们是相同的。

我怎么能这样做(最好是杰克逊)?

2 个答案:

答案 0 :(得分:0)

简单地说,你不能。您可以序列化对象,但不能序列化它们的引用。但是,如果你打算实现这一点,你可以放一个特殊字符后跟一个参数名称,当你读取json时,你可以按照以下步骤操作:

  1. 检查值是否以特殊字符开头,例如$(因此displayName的值可以是$ name)

  2. 如果是,则值的其余部分实际上是要将其值复制到变量中的变量(在本例中,名为“name”的变量)

  3. 使用反射,您可以获得引用变量的值,并将其值存储在当前变量中。 (在运行时,将name的值复制到displayName中)

  4. 但是,我强烈反对。

    编辑回应提出的问题'人们如何应对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"
        }
    ]
}

这里发生的是,不是立即编组制造商,而是在需要时提供一种获取方式。