Json - 可选子文档
Posted
技术标签:
【中文标题】Json - 可选子文档【英文标题】:Json - optional subdocument 【发布时间】:2020-11-18 21:09:23 【问题描述】:我从一个包含几个嵌套子文档的应用程序中获取一个 json。其中一些文件是可选的,并不总是存在。我想知道是否有最佳实践来处理这个问题。
例如(该文档只是一个示例,真实的看起来不同但我不能发布它,示例复制自:How to represent sub-documents in JSON array as Java Collection using Jackson?):我收到的每个文档中都没有 Adreess 子文档。
"attributes":
"type": "Lead",
"url": "/services/data/v30.0/sobjects/Lead/00Qi000000Jr44XEAR"
,
"Id": "00Qi000000Jr44XEAR",
"Name": "Kristen Akin",
"Address":
"city": null,
"country": "USA",
"state": "CA",
"stateCode": null,
"street": null
,
"Phone": "(434) 369-3100"
目前,我正在以我能想象到的最糟糕的方式接收数据,使用不同的类型,例如:
"attributes":
"type": "Lead",
"url": "/services/data/v30.0/sobjects/Lead/00Qi000000Jr44XEAR"
,
"Id": "00Qi000000Jr44XEAR",
"Name": "Kristen Akin",
"Address": "",
"Phone": "(434) 369-3100"
我想建议更好的方法,我想知道最好的方法是什么?
-
完全保留地址子文档
接收“地址:空”
接收地址:
接收地址:"city": null, "country": null, ...
其他的
就我个人而言,我会选择 Nr。 3 因为我仍然得到一个(子)文档并且可以按通常的方式处理它。有没有人反对它或有针对这种情况的最佳做法?
提前致谢。
最好的问候。
【问题讨论】:
【参考方案1】:我总是区分以下值:
设置但为空:我们通常将这些值解释为旨在为空的有效值,例如空地址簿,其中可能根本不包含任何条目。 未定义:通常这是一个可选值。如果应用程序需要来自其他地方的数据,它必须处理。 null:故意将值设置为null意味着使该值无效。我们经常使用它来重置数据。如果是通讯录,则意味着:根本没有通讯录,甚至没有一个空的。我更喜欢这些选项:
1.:如果它被遗漏,它是未定义的,意味着由应用程序来处理未定义的值。特别是对于可选值,您应该注意处理未定义的值。
3.:如果是空的,你仍然有一个有效的通讯录,但是一个空的,这使得代码中的处理更容易。
我会避免什么:
4.:你得到一个有效地址,但数据无效,所以你必须深入检查地址是否可用,这增加了验证的工作量,所以我不会使用这个选项。
5.:将数据类型更改为 "" 也很糟糕,因为对于类型化语言,它会使其难以解析,因为它需要一个对象但接收一个字符串。
【讨论】:
感谢您的意见,您的回答也是“正确的”。我刚刚接受了第一个答案。【参考方案2】:选择 3。
-
完全保留地址子文档
适用于许多反序列化工具,但很难识别结构并在调试时轻松识别是否缺少某些内容
-
接收“地址:空”
适用于许多反序列化工具,但为更复杂的属性(如数组或对象)提供 null 并不是一个好习惯。您无法轻易识别这是一个复杂的对象。
-
接收地址:
如果它们是空的,则传递空数组和空对象(如果它们是空的)是一个好习惯。您可以确定可能存在复杂对象,但此处不可用。请使用此解决方案
-
接收地址:"city": null, "country": null, ...
不要这样做。它为您提供了复杂对象的更多详细信息,但您无法轻松识别该地址是否不是故意添加的,或者 API 合作伙伴是否意外发送了不完整的地址数据,或者不完整的数据是否对他们有效。
【讨论】:
以上是关于Json - 可选子文档的主要内容,如果未能解决你的问题,请参考以下文章
Educational Codeforces Round 110 (Rated for Div. 2) - C. Unstable String - DP