我(服务器java开发人员)和我的两个同事(ios和Android开发人员)有问题(实际上是争议)。
移动开发人员的意见:我必须更换JSON,他们从我的服务器检索,所有空字段(此字段可以是我的自定义对象的字段)为空引号(注意,Java是一种语言,具有静态类型)。原因是:他们无法找到解决方案,它允许反序列化我的JSON(映射到对象),如果它将具有空值。
我的观点:java序列化程序不能在值级别上操作,只能在类型级别上操作。所以,我只能为某些类编写序列化程序。并且,我不知道为什么,但空洞的引号而不是空在我看来非常糟糕的做法,这可能在将来产生许多问题。
答案 0 :(得分:3)
假设您正在尝试向字段推断类型,因此名为f
的假设通常包含number
s。
这对我来说很有意义,因为你将一种强类型语言与一种非类型语言结合起来。
如果f
实际上是null
服务器端,那么将空字符串替换为null
值是否有意义?不是我。
我通常邀请我的团队对这类问题保持强烈的一致性,因为对于有这样一个可变领域的新人来说,这可能会更加棘手。而且,说实话,一个空字符串并不能告诉我你没有实际价值,相反它在我看来你有一个它是一个空字符串!!
也就是说,涉及null
值的方法听起来更加连贯。
除了在其他回复中已经讨论过的其他提议之外,另一个解决方案可能是消除这些字段,但它会破坏其父对象的结构,但仍然可能导致比null
更糟糕的问题在那里。
在最糟糕的情况下,如果他们不想处理null
值,他们可以引入一个用默认值代替他们的图层来推动他们。这样,你就可以说api是有意义的。
答案 1 :(得分:1)
将null
序列化为''
的想法对我来说听起来很疯狂(好吧,我更像是一个Java人,但创建了许多REST API)。如果反序列化null
是前端的问题,我建议将这些值保留。
这有三个好处:
没有返回未使用的密钥,响应变得更加干净和紧凑。
前端没有麻烦,因为它根本不会反序列化它。
保留未使用的输出会使API更改变得更加容易,因为在删除之前首先留空时不需要处理未知属性
大多数框架都支持这种处理(例如Jackson ObjectMapper.configure(SerializationFeature.WRITE_NULL_MAP_VALUES, false)
)。
答案 2 :(得分:0)
将null转换为''会破坏对象的语义,听起来像是一种不好的做法。 Jackson和Gson都允许空值,让您决定是否忽略具有null值或空值的字段。您可以在不破坏对象语义的情况下逐案判断