【问题标题】:Compare JSON structures比较 JSON 结构
【发布时间】:2018-08-14 16:59:30
【问题描述】:

我想将收到的 JSON 数据与 JSON“模板”进行比较,如果它的结构不同(而不是数据本身),则执行一些操作,例如丢弃该 JSON。

模板:

{
"data":{
    "id":"1",
    "cmd":"34"
}

成功的 Json:

{
"data":{
    "id":"15",
    "cmd":"4"
}

不成功的 Json:

{
"data":{
    "id":"15"
}

这只是一个例子,要评估的 JSON 会更大,我想避免检查每个属性是否存在。 (这在其他语言中是可能的,因此这个问题)

【问题讨论】:

  • 你看过JSON Schema吗?
  • 那么,只有数据对象中的键重要吗?
  • "...我想避免检查每个属性是否存在。(这在其他语言中是可能的,因此这个问题)" 仅仅因为它们暴露了一个高-执行此操作的级别 API 并不意味着他们不检查每个属性是否存在。除了检查属性之外,我无法想象任何其他方式。
  • "JSON 模板" - 你的意思是架构?

标签: javascript json comparison


【解决方案1】:

听起来您正在寻找JSON Schema 或其他类似工具。

JavaScript 本身不提供任何内置功能来为您执行此操作。所以你需要一个已经编写好的工具来完成它(例如 JSON Schema),或者你必须自己做,检查接收到的每个属性的存在和(取决于你想要的严格程度)类型JSON。您可以在解析之后或在解析期间通过传递给JSON.parse 的“reviver”函数挂钩到解析过程来执行此操作,但无论哪种方式都需要进行检查。 (考虑到 JSON.parse 的由内到外的工作方式,我怀疑为此使用 reviver 会非常困难。之后对解析的数据使用递归函数会更好。)

【讨论】:

  • 我不知道 JSON Schema,我会研究它,现在我知道除了手动检查之外,在 JS 中没有“本机”方法可以做到这一点。这回答了我的问题。谢谢!
【解决方案2】:

我建议将其转换为对象JSON.parse(),以便您可以使用javascript API。 如果您的结构在未来变得更加健壮(更多级别等),您仍然可以进行深度比较。 Immutable.js 之类的库会派上用场,因为它用于比较 React 应用程序中的复杂状态。

【讨论】:

    【解决方案3】:

    我最近也遇到了这个问题。我需要对一些对象进行一些比较(也应该适用于 JSON)。我为此编写了一个包,它可能对将来面临这个问题的人派上用场(对于主题启动器来说有点晚了)。

    https://www.npmjs.com/package/js-object-compare

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 2013-05-25
      • 1970-01-01
      • 1970-01-01
      • 2016-01-15
      相关资源
      最近更新 更多