检查 JSON 模式中不同的嵌套属性

2024-05-14

有没有办法在嵌套 JSON 模式中实现相当于 CHECK 约束的 Postgres?假设我们有具有两个属性的数据,每个属性都有嵌套属性。 JSON Schema 如何使第一个对象所需的内容依赖于第二个对象?

我的真实案例场景是为 GeoJSON 对象构建 JSON 模式,该对象具有几何对象(即点或多边形,或 null),以及“属性”对象中的其他属性。我想根据几何形状的类型更改所需的属性。

我使用以下两种解决方案都失败了:

  • 将“allOf”嵌套在“anyOf”内以涵盖所有可能性
  • 复制“定义”以具有attributes_no_geom、geometry_no_geom、attribute_with_geom和geometry_with_geom,并在“anyOf”中声明它们

这将得到验证,因为属性/位置涵盖了几何图形的缺乏:

{
    "attributes": {
        "name": "Person2",
        "place": "City2"
    },
    "geometry": null
}

这也将得到验证,因为几何不再需要属性/位置:

{
    "attributes": {
        "name": "Person1"
    },
    "geometry": {
        "type": "Point", 
        "coordinates": []
    }
}

EDIT

基于 Relequestual 的答案,这是我得到的令人不满意的结果:

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "definitions": {
    "geometryIsPoint": {
      "type": "object",
      "required": ["type"],
      "properties": {
        "type": {
          "const": "Point"
        }
      }
    },
    "partialAttributes": {
      "type": "object",
      "required": ["name"],
      "properties": {
        "name": {
          "type": "string"
        },
        "place": {
          "type": "string"
        }
      }
    },
    "fullAttributes": {
      "type": "object",
      "required": ["name", "place"],
      "properties": {
        "name": {
          "type": "string"
        },
        "place": {
          "type": "string"
        }
      }
    },
    "conditionalAttributes": {
      "allOf": [
        {
          "if": {
            "$ref": "#/definitions/geometryIsPoint"
          },
          "then": {
            "$ref": "#/definitions/partialAttributes"
          },
          "else": {
            "$ref": "#/definitions/fullAttributes"
          }
        }
      ]
    }
  },
  "properties": {
    "attributes": {
      "$ref": "#/definitions/conditionalAttributes"
    },
    "geometry": {
      "$ref": "#/definitions/geometryIsPoint"
    }
  }
}

如果以下情况,此模式将不会验证以下内容:attributes/place属性被删除。

{
    "attributes": {
        "name": "Person",
        "place": "INVALID IF THIS LINE IS REMOVED ;-("
    },
    "geometry": {
        "type": "Point", 
        "coordinates": {}
    }
}

您可以使用if/then/else关键词 https://datatracker.ietf.org/doc/html/draft-handrews-json-schema-validation-01#section-6.6有条件地应用子模式。

我们只想if and then为您提供解决方案。

两者的值都必须是 JSON Schema。

如果值if导致肯定的断言(当模式应用于实例并且验证成功时),则模式值then应用于实例。

这是架构。

我已经预先加载了架构和数据https://jsonschema.dev https://jsonschema.dev/s/N4IgziBcLAOgdgAkbEASMBjAFgUwLYCGqkKI2ALhQA6QD0dAVmAPbwC0WeRAdCwE4BzOgBN+hAGYV2ABgDsdLgUIBiVABoEyVCNwSAlvH0V9bMCURwkyMoNwt8uCvwCeASTAAFFoYoWrNjao-LgAjgCu+iEiFgDaWoFBIBQu1LioCYEAuprWgajU-Cxp-Ca45lCWmYmoKWn+1YlkmGZ+lajevhl5iQC+jYj9Pb25+SB2Dk6uAIJePvBtpAE1ICERUbgxlfE9Yy0CIoaEFOXdTTkDBUUlZRVLA9og+-yH8MenlctNj3Xp7SCEfjiFxnb5DJrgmwjaqoCaOZwgz6XAEAGxRAHkJHEHlVdit9FikXimqg0CFCaRUCpRHpDMZTPAwHQ4VN3HMuiAcchocSkhQ8PAGryxmS9BYqTSDEYTGZmfZ4TN2QtQd9BjjIdlqpCeY9CsVcKV9B97j1YfLWUKSehyeKQNTdFL6bKWQiVWrrENeiB1CB9FAYDCAVR+PoAEbhE53XGq1BvRy2zwG1jwACMbp1SRdrkt31qqT+lJAnWV3pQvNQz1e7yjwA17q9vSAA这样你就可以实时测试它。

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "definitions": {
    "geometryIsPoint": {
      "required": [
        "type"
      ],
      "properties": {
        "type": {
          "const": "Point"
        }
      }
    },
    "geometryAsPoint": {
      "required": [
        "coordinates"
      ],
      "properties": {
        "coordinates": {
          "type": "array"
        }
      }
    },
    "geometry": {
      "allOf": [
        {
          "if": {
            "$ref": "#/definitions/geometryIsPoint"
          },
          "then": {
            "$ref": "#/definitions/geometryAsPoint"
          }
        }
      ]
    }
  },
  "properties": {
    "geometry": {
      "$ref": "#/definitions/geometry"
    }
  }
}

该物业geometry引用定义geometry.

allOf是一个模式数组。

的价值allOf[0].if引用定义为的模式geometryIsPoint.

架构定义为geometryIsPoint被应用到geometry价值。如果验证成功,则then应用引用的架构。

您不必使用引用来执行任何操作,但我认为这使意图更加清晰。

根据需要扩展架构,将架构添加到allOf适用于您想要识别的任意多种几何类型。


Edit:

你正在击中else你的条件的条件,因为if验证失败。让我解释。

这是一个更新的架构,用于涵盖您修改后的用例。

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "definitions": {
    "geometry": {
      "type": "object",
      "required": [
        "type"
      ],
      "properties": {
        "type": {
          "enum": [
            "Point",
            "somethingelse",
            null
          ]
        }
      }
    },
    "geometryIsPoint": {
      "type": "object",
      "required": [
        "type"
      ],
      "properties": {
        "type": {
          "const": "Point"
        }
      }
    },
    "attributes": {
      "properties": {
        "name": {
          "type": "string"
        },
        "place": {
          "type": "string"
        }
      }
    },
    "partialAttributes": {
      "type": "object",
      "required": [
        "name"
      ]      
    },
    "fullAttributes": {
      "type": "object",
      "required": [
        "name",
        "place"
      ]
    },
    "conditionalAttributes": {
      "allOf": [
        {
          "if": {
            "required": [
              "geometry"
            ],
            "properties": {
              "geometry": {
                "$ref": "#/definitions/geometryIsPoint"
              }
            }
          },
          "then": {
            "required": [
              "attributes"
            ],
            "properties": {
              "attributes": {
                "$ref": "#/definitions/partialAttributes"
              }
            }
          },
          "else": {
            "required": [
              "attributes"
            ],
            "properties": {
              "attributes": {
                "$ref": "#/definitions/fullAttributes"
              }
            }
          }
        }
      ]
    }
  },
  "properties": {
    "attributes": {
      "$ref": "#/definitions/attributes"
    },
    "geometry": {
      "$ref": "#/definitions/geometry"
    }
  },
  "allOf": [
    {
      "$ref": "#/definitions/conditionalAttributes"
    }
  ]
}

这是一个JSON 架构开发链接 https://jsonschema.dev/s/N4IgziBcLAOgdgAkbEASMBjAFgUwLYCGqkKI2ALhQA6QD0dAVmAPbwC0WeRAdCwE4BzOgBN+hAGYV2ABgDsdLgUIBiVABoEyVCNwSAlvH0V9bMCURwkyMoNwt8uCvwCeFqzZuoKL6rguoLABGjLiYFBpanmT8uACOAK76sSIWANpR0WQ+fqiZNgC6mtaeqNT8LH78JrjmUJb5pSA5-vUeWV4guPAJ+OmNHagACiyGESDFHdGorI4U2IZ2ADZgrZNTNj1LSwOeBbuIAL4DxyVH69ogdg5OrgCSYCNj7gPevq2kgSFh4xedsYlkrhUvUMmcmi08uDEEVXiBypVcNV9LUXtDLpC2gdLpgzONPiAnvBxgdTlkyTZDn9UIQqPx9EEEhRUVjoWUKlUanVSO0sqh4IRHGiNtl3gFwM5FlCplSDmUloRMB8GujOpiCWBJfBBNKOhTPPrzvkyoRkYQlgBBOkMpksnlw9VkYKhcKRNkgAFJFL9VX8wWtAYFPlnWVnVASBLbK2SxnM7kqvnNMX1L4u35wz1AkGkMFTP1CiZy+EKpW6vb5UNNXHwETGUwCy3W2N2hPTEDmpYAeQkPqmvMGIH0PdZIsume9oOxbeuc1cZY2sNVTQRnJR8f7ItQM9ubhHo6aaFiw4JKlEekMdbMdG3zhcDyJJKX0UNMqnlY23jw8GFo9Q4+Bvb7mQtIxradRTsgi77uyiLIi2G4fu2TZgT+QFkIeejiqeugGEYJhXtQpomOa0b0s24FPgaEFHG+fyJrgKzKghib-tmiC5kBNLIXG85TFBv7whySJcqhAkgWRKF7mhqAYceZDYeeeH1mAdARlG3EstRyAvnqb6koGFZRO+MGrvBxpIaBPFSZ0slYWeuGXvAKniTaVkVtSVz2LOu72u6tkpiACkOfhTnXl5O7zhSxntts3aAcgCEyUedk4ReIUqdWtYhSRGkUVR1j7PAhwTIOUAwOZLnkaJTQCgWBJDEirDfoWvogAAcp2AAqiBDAAMhaADCACi4p3G1ABqFq9XcAAiiB3AAYognUABJ3AAyog01tUN82bQASkNACynbjUNc0ANzsAAFJFHk3nO1kQsmBIdd1QydmNnUaCgrW4gItYClZPKGqcxWHEAA这样你就可以测试它。

我们在这里所做的就是分散关注点。

的“形状”attributes and geometry在定义中用相应的键定义。这些模式不断言这些对象中需要哪些键,仅断言如果提供了它们必须是什么。

Because $ref在模式中忽略模式中的所有其他关键字(对于草案 7 或以下),在根级别,我将引用包装为conditionalAttributes in an allOf.

conditionalAttributes是一个定义的 JSON Schema。我用过allOf这样您就可以添加更多条件检查。

的价值conditionalAttributes.allOf[0].if是一个 JSON 架构,并应用于 JSON 实例的根。它需要一个密钥geometry并且该值是geometryIsPoint。 (如果省略required,您最终会遇到验证问题,因为省略该键将通过 if 条件)。

当实例结果为true断言(验证有效)if值模式,那么then值模式应用于根级别。

因为它应用于根级别并且您想要检查嵌套属性的值,所以您必须使用properties就像您处于架构的根级别时一样。THIS是你如何进行条件模式应用程序(if/then/else)跨越实例的不同深度。

您可以通过将架构值之一更改为来测试条件解析false并查看错误。记住,true and false是有效的 JSON 模式,因此您可以编写"then": false如果您期望导致错误then要应用的模式(如if模式断言验证正常)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

检查 JSON 模式中不同的嵌套属性 的相关文章

  • 如何解析 Newtonsoft JSON 中的 TimeSpan 值

    我想解析 JSON 字符串并使用token Type用于检测类型值的属性JTokenType TimeSpan 我无法弄清楚如何在输入字符串中表达 TimeSpan 所有内容似乎都被解释为 JTokenType String var tim
  • Android Volley 服务器错误

    I am posting data all strings to varchar variables in server but i am getting volley server error or badnetwork performa
  • PHP json_encode 反斜杠和数组名称的问题

    我正在将一些 postgresql 数据转换为 PHP json encode 但我遇到了一些问题 json encode 将 BackSlash 添加到我的数据中的所有斜杠中 在描述中出现段落标记的结束 我认为是因为反斜杠问题 我不希望我
  • 在 jQuery 中获取 Json 数据

    没有一个清晰的示例解释如何尽可能简单地拉取 json 数据 我有一个有效的 json 我需要使用 jQuery 检索它 我的 json 输出如下 title blog entries items title Can Members of t
  • 按日期对 JSON 进行排序

    我知道这一定相对简单 但我有一个 JSON 数据集 我想按日期排序 到目前为止 我每次都会遇到问题 现在我将日期存储为this lastUpdated 如果有帮助的话 我可以访问 jquery 但我意识到 sort 是本机 JS 提前致谢
  • 如何使用 *non-case* 类通过 Scala 从 JSON 反序列化?

    我正在编写一个 Scala 应用程序 需要序列化和反序列化 JSON 某些 JSON 对象具有超过 22 个字段 因此我无法使用案例类 并且也无法更改格式 我找到的所有 Scala JSON 库都只能 轻松地 与案例类一起使用 而不是与普通
  • Android 和 Facebook SDK:从 /me/picture 图形调用中解码图片

    编辑 Anwser 在这篇文章的末尾 我正在尝试通过内置的 Facebook SDK 功能获取 Facebook 用户的个人资料图片Request 我正在使用一个 me picture调用获取个人资料图片并将其转换为Bitmap 调用工作正
  • 如何读取本地 JSON 文件进行测试

    我正在尝试编写用于 json 验证的单元测试 因为该应用程序严重依赖于来自 REST API 的 json 我有一个包含简单 json 的本地文件 goodFeaturedJson txt 内容 test TEST 测试用例 void te
  • Android AsyncTask 第二次调用时未执行

    我有一个扩展 AsyncTask 的类 public class SendJSONArray2Server extends AsyncTask
  • 如何将对象转换为 JSON 表示形式

    奇怪的是 我没有找到这个 将对象转换为 JSON 字符串的最简单方法是什么 对象图中的循环等边缘情况对我来说不太感兴趣 让我们找到 A 类简单情况的解决方案 其中包含 B C D 类的一些对象和一些基元 基本的收集支持是必须的 呵呵 我发现
  • Flot 0.8.2 折线图 - 颜色错误

    我正在使用 Flot 折线图并设置它们的颜色 我发现了一个奇怪的错误 在前 3 种颜色之后 绘图对所有其他线条使用最后一种颜色 这不是正确的行为 更有趣的是图例显示了正确的颜色 这是一个已知的错误 var dataSet label d1
  • 在redis中存储多个嵌套对象

    我想在redis中存储多个复杂的json数据 但不知道如何 这是我的 json 结构 users user01 username ally email email protected cdn cgi l email protection u
  • 与 Jackson 一起从 ASP.NET 反序列化日期

    我有一个 json 字符串 从 ASP NET Rest 服务返回 中的日期 如下所示 created Date 1277931782420 0700 杰克逊无法解析该日期 我可以编写自己的日期格式并将其传递给mapper getDeser
  • 如何使用Gson将JSONArray转换为List?

    在我的 Android 项目中 我试图将收到的 JSONArray 转换为列表 在 的帮助下这个答案 https stackoverflow com questions 8371274 how to parse json array in
  • 如何在 laravel 中查询 json 列?

    我用的是 Laravel 5 6 我有一块田地 字段的数据类型为json 字段 desc 字段 的值如下所示 code 1 club CHE country ENGLAND code 2 club BAY country GERMANY c
  • 替换 WCF 默认 JSON 序列化

    是否可以替换 WCF 的默认 JSON 序列化 我目前正在使用webHttp行为 并通过application json作为 MIME 类型 特别是 我不喜欢默认情况下每个属性都是键 值对 例如 Key PropertyName Value
  • 无法使用 Python 循环分页 API 响应

    所以 我对这个感到摸不着头脑 使用 HubSpot 的 API 我需要获取我客户的 门户 帐户 中所有公司的列表 遗憾的是 标准 API 调用一次只能返回 100 家公司 当它返回响应时 它包含两个参数 使分页响应成为可能 其中之一是 ha
  • Node.js 中的 JSON Zip 响应

    我对 node js 还很陌生 我正在尝试发回包含 JSON 结果的 zip 文件 我一直在尝试弄清楚如何去做 但还没有达到预期的结果 我正在使用 NodeJS ExpressJS LocomotiveJS Mongoose 和 Mongo
  • 如果是数字,Chrome 会重新排序对象键,这是正常/预期的吗

    我注意到某些评估电子商务网站的某些鞋码并将其输出到屏幕上的代码会打乱 Chrome 中的顺序 给出的 JSON 可以是 7 9149 9139 10455 17208 7 5 9140 9150 10456 17209 8 2684 914
  • 在 json 模式中制作条件数组并提供适当的错误消息的最佳方法

    我想在 JSON 模式中约束一个 元组 数组 并获得不错的错误消息 但到目前为止我还没有成功 该数组由 2 个项目组成 第一个是字符串 第二个是对象 对象中允许 必需的属性取决于字符串 2个有效的例子是 color white a whit

随机推荐

  • 使用 Fullcalendar 和 Google 日历向过去的活动添加类

    我想更改过去事件的颜色 我想我需要向它们添加一个类 但这就是问题所在 我该怎么做 最好将类添加到事件对象的 className 属性中http arshaw com fullcalendar docs event data Event Ob
  • 如何使用 php 从字符串中提取日期

    我需要从字符串中提取日期 下面是我的代码和字符串 str Updated status to Masters Software Engineering Enrolled Documents to Send on 03 06 2014 14
  • 最好的开源帮助票系统是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Python matplotlib:将轴标签/图例从粗体更改为常规粗细

    我正在尝试制作一些出版质量的图 但遇到了一个小问题 默认情况下 matplotlib 轴标签和图例条目的权重似乎比轴刻度线重 是否有办法强制轴标签 图例条目与刻度线的重量相同 import matplotlib pyplot as plt
  • 选择在 Excel 宏(VBA 中的范围对象)中具有值的列

    如何修改 VBA 中的这一行以仅选择具有值的列 Set rng Range A1 Range A65536 End xlUp SpecialCells xlCellTypeVisible 我不认为我做的事情是正确的CountLarge财产是
  • 安装 SQL Server 2012 错误“系统无法打开指定的设备或文件。”

    我正在尝试在已安装 SQL Server 2008 R2 Express 和 Windows 7 的计算机上安装 SQL Server 2012 Developer 我使用 Microsoft Secure Download Manager
  • 使用 fzf-tmux 进行快速窗口切换的 tmux 脚本给了我错误的选项

    我编写了以下内容 它允许我使用 fzf 切换 tmux 窗口 tmux list windows F I W fzf tmux cut d f 1 xargs tmux select window t 当我在 shell 中运行它时 它工作
  • 数组中连续元素的最大乘积

    我在现场面试的时候被问到了这个算法问题 由于没有要求我签署保密协议 我将其发布在这里寻求答案 给定一个数组REAL不包含 0 的数字 找到产生最大乘积的连续元素 该算法应在线性时间内运行 我考虑过以下方法 使用两个数组 第一个是利用DP思想
  • k8s书签解决什么问题?

    我正在尝试做什么 我正在尝试进行部署并监视 k8s 事件 直到部署准备好使用k8s节点API 手表 https github com kubernetes client javascript blob master examples typ
  • Python RE(总之检查第一个字母是否区分大小写,其余部分不区分大小写)

    在下面的情况下 我想匹配字符串 Singapore 其中 S 应始终为大写 其余单词可能为小写或大写 但在下面的字符串 s 是小写的 它在搜索条件中匹配 任何人都可以让我知道如何实施吗 import re st Information in
  • 从 R 到 C 处理列表并访问它

    我想使用从 R 获得的 C 列表 我意识到这个问题与此非常相似 使用 call 在 R 和 C 之间传递数据帧 https stackoverflow com questions 6658168 passing a data frame f
  • 使用 Apache 允许 Glassfish 和 PHP 在同一服务器中协同工作

    是否可以建立从 Java 到 php 文件的桥梁 我有一个用 Java 编写的应用程序 我需要执行http piwik org http piwik org 这是用 PHP 编写的 在服务器中 我正在运行 PHP 但无法从浏览器访问 php
  • IMAP 转发器

    我想知道从 IMAP 帐户转发邮件的最快 最可靠的方法是什么 我的大学不允许我们的学生邮箱转发到私人电子邮件帐户 这里每个人都使用 Gmail 或 Hotmail 这是一个政治问题 而不是技术问题 我们确实可以通过 IMAP 访问邮箱 我想
  • 如何从 PHP 中的字符串创建可能的字符串组合?

    如何从 PHP 中的字符串创建可能的字符串组合 Exp input abc output array 0 gt a 1 gt ab 2 gt abc 3 gt ac 4 gt acb 5 gt b 6 gt ba 7 gt bac 8 gt
  • Socket.io 与服务器离线连接

    如何检测服务器是否离线或由于其他原因无法连接 我的代码看起来像这样 this socket io connect connectionInfo reconnect false 它不会抛出任何错误 因此 try catch 子句不起作用 Us
  • 在completionHandlers中存储值 - Swift

    我正在创建一个completionHandler它返回一个字典 但是当我在另一个类中调用这个方法时 它的值是零 func fetchLatestPosts completionHandler responseDict NSDictionar
  • SlickGrid 回调onRowSelect?

    我想在用户选择表中的一行时添加回调 但我不知道该怎么做 这是我到目前为止所拥有的
  • .NET 客户端中 Google 表格中的条件格式请求

    我知道如何在 Google Sheets API 中对值和其他格式进行批量电子表格更新请求 但条件格式似乎有所不同 我已正确设置请求 AddConditionalFormatRuleRequest formatRequest new Add
  • Xamarin Forms WebView 打开外部链接

    我的应用程序中有一个网络视图 当单击外部链接 在普通浏览器中在新选项卡中打开 时 我无法返回我的网站 当打开一个新标签时 有可能像 Gmail 一样关闭该标签的菜单吗 目的是 每当单击链接时 用户都可以选择使用哪个选项来查看内容 例如单击链
  • 检查 JSON 模式中不同的嵌套属性

    有没有办法在嵌套 JSON 模式中实现相当于 CHECK 约束的 Postgres 假设我们有具有两个属性的数据 每个属性都有嵌套属性 JSON Schema 如何使第一个对象所需的内容依赖于第二个对象 我的真实案例场景是为 GeoJSON