当前位置: 首页 > 知识库问答 >
问题:

JSON模式:带有“additionalproperties”的“Allof”

单于淇
2023-03-14
{
  "$schema": "http://json-schema.org/draft-04/schema#",

  "definitions": {
    "address": {
      "type": "object",
      "properties": {
        "street_address": { "type": "string" },
        "city":           { "type": "string" },
        "state":          { "type": "string" }
      },
      "required": ["street_address", "city", "state"]
    }
  },

  "type": "object",

  "properties": {
    "billing_address": { "$ref": "#/definitions/address" },
    "shipping_address": {
      "allOf": [
        { "$ref": "#/definitions/address" },
        { "properties":
          { "type": { "enum": [ "residential", "business" ] } },
          "required": ["type"]
        }
      ]
    } 

  }
}
{
      "shipping_address": {
        "street_address": "1600 Pennsylvania Avenue NW",
        "city": "Washington",
        "state": "DC",
        "type": "business"
      }
}
"shipping_address": {
          "allOf": [
            { "$ref": "#/definitions/address" },
            { "properties":
              { "type": { "enum": [ "residential", "business" ] } },
              "required": ["type"]
            }
          ],
          "additionalProperties":false
        } 
[ {
  "level" : "error",
  "schema" : {
    "loadingURI" : "#",
    "pointer" : "/properties/shipping_address"
  },
  "instance" : {
    "pointer" : "/shipping_address"
  },
  "domain" : "validation",
  "keyword" : "additionalProperties",
  "message" : "additional properties are not allowed",
  "unwanted" : [ "city", "state", "street_address", "type" ]
} ] 

问题是:我应该如何仅限制shipping_address部分的字段?提前谢了。

共有1个答案

郤令
2023-03-14

[这里是v4验证规范草案的作者]

您已经偶然发现了JSON模式中最常见的问题,即它根本无法像用户期望的那样进行继承;但同时也是其核心特征之一。

当您这样做时:

"allOf": [ { "schema1": "here" }, { "schema2": "here" } ]
  • StrictProperties,
  • 合并

那么shipping_address的架构将是:

{
    "merge": {
        "source": { "$ref": "#/definitions/address" },
        "with": {
            "properties": {
                "type": { "enum": [ "residential", "business" ] }
            }
        }
    }
}

同时在address中将strictproperties定义为true

{
    "extends": { "type": "null" },
    "type": "string"
}

现在,那个:

{
    "allOf": [ { "type": "string" }, { "type": "null" } ]
}

他们是一样的。或者也许是那样?

{
    "anyOf": [ { "type": "string" }, { "type": "null" } ]
}

还是那个?

{
    "oneOf": [ { "type": "string" }, { "type": "null" } ]
}
 类似资料:
  • 我正在查看用Scala编写GraphQL服务器的Sangria库。但奇怪的是,同一个类型系统必须实现两次:(1)作为GraphQL类型声明的一部分,(2)也是在服务器端,作为Scala case类,附带ObjectType、InterfaceType等。 在Scala中硬编码类型系统尤其令人厌烦,因为我的目的是能够CRUD任意形状的聚合,其中每个形状都被定义为类型的GraphQL集合。例如,假设S

  • 我有一个有组的模式。这些组都是可选的。 完整的posible模式是: 但也可以看起来像这样 不可能在组中获得限定词,例如(组A不可能' = ')。 所以我尝试了这些正则表达式: 问题: 如果缺少组,则不匹配 具有“#”(E)的组包含第一个组“-”(F)<ul> 001.002 可编程逻辑控制器。003 M01.001 P1 测试-KF2-- 我的错是什么?

  • 问题内容: 我知道这个问题有答案,但它们并没有为我充分发挥作用。我正在使用Angular 1.4和Express4。Express正在处理API调用,而Angular应该正在处理所有HTML。 我的快递app.js: 这是有角度的app.js 现在,如果我转到http:// localhost:3000 / ,则会得到预期的主Angular视图。问题是当我转到http:// localhost:3

  • 因此,我们计划使用Avro在融合的Kafka生态系统上进行交流。我目前对Avro的理解是,每条消息都有自己的模式。如果是这样的话,我们需要模式注册表来解决版本更新吗? 我问,因为在每条消息中携带模式可以防止需要像模式注册表这样的东西来将消息ID映射到模式。还是我在这里错过了什么?

  • 我们使用Apache Kafka(不是confluent Kafka)0.10。我们想用Kafka设置AVRO模式。我有如下的avro模式。 序列化消息, 这正像预期的那样起作用。 但是,希望在主题级别设置一个Avro模式,这样,如果消息不符合Avro模式,主题将拒绝消息。 不管怎么说,我可以用阿帕奇Kafka0.10做到这一点。

  • 我目前正在使用FileWriter创建并写入文件。有没有什么方法可以每次都写入同一个文件而不删除其中的内容?