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 - 可选子文档的主要内容,如果未能解决你的问题,请参考以下文章

带有可选子路径的 Laravel 路由

从可选子查询中插入多个返回值

带有可选子命令的 argparse 未按预期工作

RegEx - 正向后视中的可选子字符串

验证字符串以仅包含限定字符和中间的特定可选子字符串

Educational Codeforces Round 110 (Rated for Div. 2) - C. Unstable String - DP