【问题标题】:Change serialization deepness改变序列化深度
【发布时间】:2018-05-06 20:56:36
【问题描述】:

我正在使用 Spring Boot 构建一个 Restful API,但遇到了问题。
我有一个名为 Event 的实体,它具有以下属性: Long id、String title、Calendar date、List owner (OneToMany)、Double price。
Entity 又具有以下属性:Long id、String name、CalendarbirthDate、List cars。
Entity Car 又具有 Long id 和 String 模型作为属性。

问题是,当我在事件控制器中访问 HTTP 方法 GET 时,我得到了这个 JSON:

{  
    "id":1,
    "title":"Example event",
    "date":"2017-01-01",
    "owners":[  
        {  
            "id":1,
            "name":"Chuck Norris",
            "birthDate":"1000-05-12",
            "cars":[  
                {  
                    "id":1,
                    "model":"Shelby GT"
                }
            ]
        },
        {  
            "id":2,
            "name":"Bruce Lee",
            "birthDate":"1980-05-12",
            "cars":[  
                {  
                    "id":2,
                    "model":"Ford Maverick"
                }
            ]
        }
    ],
    "price":5
}

我只想要他们的 ID,而不是序列化整个所有者对象,如下所示:

{  
    "id":1,
    "title":"Example event",
    "date":"2017-01-01",
    "owners":[  
        {  
            "id":1
        },
        {  
            "id":2
        }
    ],
    "price":5
}

我怎样才能做到这一点?而且,这是否正确使用?我认为序列化整个内部对象是一种资源浪费,因为我现在不需要它们的所有属性,而且它还会导致双向关系的循环

【问题讨论】:

  • 你们有哪些双向关系?

标签: json spring rest spring-boot serialization


【解决方案1】:

对于这个用例,我开发了一个用于动态过滤的小型 jackson 模块:

https://github.com/Antibrumm/jackson-antpathfilter

第二种可能性是为您的端点构建 DTO。

【讨论】:

    【解决方案2】:

    为不想被序列化的字段添加@JsonIgnore注解

    【讨论】:

    • 但是这样做,我也将无法通过用户控制器获取这些字段,对吗?我需要在那里找到这些字段
    【解决方案3】:

    听起来您想要返回事件的自定义视图,但实际上使用完整对象可能会更好,具体取决于您的 API 用户需要对事件执行什么操作。一种选择,特别是因为您评论其他调用需要序列化完整的 User 对象,是为此方法中使用的 ObjectMapper 配置 User 的自定义序列化程序。

    【讨论】:

    • 任何提示我可以如何做到这一点?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 2013-04-12
    • 2011-01-23
    • 1970-01-01
    相关资源
    最近更新 更多