JSON 中的空字段:空引号、空值或删除字段?

Null field in JSON: empty quotes, null value, or remove field?

我(服务器 java 开发者)和我的两个同事(ios 和 Android 开发者)有一个问题(实际上是争执)。

移动开发人员的意见:我必须将他们从我的服务器检索到的 JSON 中的所有空字段(该字段可以是我的自定义对象的字段)替换为空引号(注意,那个Java 是一种具有静态类型的语言)。这样做的原因:他们找不到解决方案,这允许反序列化我的 JSON(映射到对象),如果它将具有空值。

我的意见:java 序列化程序不能在值级别上操作,只能在类型级别上操作。所以,我只能为一些 class 编写序列化程序。而且,我不知道为什么,但是空引号而不是 null 在我看来是非常糟糕的做法,这会在将来造成很多问题。

null 序列化为 '' 的想法对我来说听起来很疯狂(好吧,我更像是一个 Java 人,但创建了许多 REST API)。如果反序列化 null 是前端的问题,我建议将这些值排除在外。

这具有三个优点:

  1. 没有返回未使用的键,响应变得更加干净紧凑。

  2. 前端没有麻烦,因为它根本不会反序列化它。

  3. 不使用会使 API 更改更容易,因为在删除它们之前先留空时不需要处理未知属性

大多数框架都支持这种处理方式(例如 Jackson ObjectMapper.configure(SerializationFeature.WRITE_NULL_MAP_VALUES, false))。

假设您正在尝试推断字段的类型,因此假设一个名为 f 的字段通常包含 numbers。

这对我来说很有意义,因为您正在将一种强类型语言与一种非强类型语言结合起来。

一旦碰巧 f 实际上是 null 服务器端,用空字符串代替 null 值对您来说有意义吗?对我来说不是。

我通常会邀请我的团队对这类问题保持高度一致,因为对于拥有如此可变领域的新人来说,这可能会更加棘手。此外,老实说,一个空字符串并没有告诉我你没有实际值,相反,在我看来你有一个,但它是一个空字符串!!

也就是说,涉及 null 价值观的方法对我来说听起来更加连贯。

除了已在其他回复中讨论过的其他建议外,另一种解决方案可能是清除这些字段,但它会破坏其父对象的结构,并且仍然会导致比 [=13] 更糟糕的问题=]在那里。

在最坏的情况下,如果他们不想处理 null 值,他们可以引入一个层,用默认值替换它们以推动他们的一方。这样一来,您就可以说 api 是有意义的。

将 null 转换为 '' 会破坏对象的语义,这听起来是一种不好的做法。 Jackson 和 Gson 都允许空值,并让您决定是否忽略具有空值或空值的字段。您可以在不破坏对象语义的情况下逐案决定