gpt4 book ai didi

java - 设计 JSON api 时的内部对象表示

转载 作者:太空宇宙 更新时间:2023-11-04 06:36:54 25 4
gpt4 key购买 nike

我有一个对象设计问题。

我正在用 Java 构建一个 json api。我的系统使用 pojos 来表示 json 对象,并使用 Jackson 将它们从 json 转换为 pojo。每个对象需要在不同的上下文中采取不同的形式,我无法决定是创建一堆单独的类,每个上下文一个,还是尝试让一个公共(public)类在所有情况下都有效。

让我举一个具体的例子。

系统有用户。 api有一个添加、修改和删除用途的服务。数据库中有一个用户表。数据库记录如下所示:

{
id: 123, // autoincrement
name: "Bob",
passwordHash: "random string",
unmodifiable: "some string"
}

当您发布/添加用户时,您的 pojo 不应包含 ID,因为它是自动生成的。您还希望能够包含一个密码,该密码会被散列并存储在数据库中。

当您 PUT/更新用户时,您的 pojo 不应包含不可修改的字段,但它必须包含 id,以便您知道正在修改的用户。

当您获取/检索用户时,您应该获取除密码哈希之外的所有字段。

因此,代表用户的 pojo 具有不同的属性,具体取决于您是添加、更新还是检索用户。并且它在数据库中具有不同的属性。

那么,我应该在系统中创建四个不同的 pojo 并在它们之间进行翻译吗?或者创建一个 User 类并尝试使用 Jackson View 或其他某种机制使其在不同情况下看起来不同?

我发现后一种方法确实很难管理。

最佳答案

在我看来,您应该只创建一个具有所有所需属性的 POJO - User。现在您应该决定您的 API 是严格的还是宽松的。如果您的 API 很严格,那么当接收到错误的 JSON 数据时,它应该返回错误。在宽松的版本中API可以跳过多余(不必要)的属性。

在提供示例之前,让我将“passwordHash”属性更改为“password”。

添加新用户/POST
来自客户端的 JSON 数据:

{
id: 123,
name: "Bob",
password: "random string",
unmodifiable: "some string"
}

严格的版本可以返回例如这样的内容:

{
"status": "ERROR",
"errors": [
{
"errorType": 1001,
"message": "Id field is not allowed in POST request."
}
]
}

宽松版本可以返回如下内容:

{
"status": "SUCCESS",
"warnings": [
"Id field was omitted."
]
}

对于每个 CRUD 方法,您可以编写一组单元测试,这些测试将保存您选择的方式以及允许和不允许的信息。

关于java - 设计 JSON api 时的内部对象表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25269090/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com