代码之家  ›  专栏  ›  技术社区  ›  orzel

JSON模式-具有相同数据类型的对象

  •  1
  • orzel  · 技术社区  · 7 年前

    我生成了以下JSON:

    {
     "someString" : "example",
     "obj1" : {
         "opt1" : 1,
         "opt2" : 1,
         "opt3" : "aaa"
     },
     "obj2" : {
         "opt1" : 55,
         "opt2" : 55,
         "opt3" : "bbb"
     }
    }
    

    还有更多的对象(obj1、obj2、obj3、obj4等)具有相同的数据类型(opt1、opt2、opt3)

    现在我想为此创建模式,但我不知道如何在模式中组合所有这些对象。

    编辑:

    我创建了架构:

    root: {
        "type" : "object",
        "oneOf" : [
            {
            "properties" : {
                "someString" : { "type" : "string" }
            },
            "patternProperties" : { "^.*$" : { "$ref" : "./schemas/myPatternProperties.json#" } },
            "additionalProperties" : false }
            }
        ]
    }
    

    和myPatternProperties。json外观:

    {
        "type" : "object",
        "properties" : {
            "opt1" : { "type" : "number" },
            "opt2" : { "type" : "number" },
            "opt3" : { "type" : "string" },
        }
        "required" : [ "opt1", "opt2", "opt3" ]
    }
    

    是否有任何错误,因为我生成的JSON仍然没有被识别为这种模式类型。

    1 回复  |  直到 6 年前
        1
  •  2
  •   RQman    7 年前

    据我所知,你的问题是 describe object with a lot of properties with the same type and some naming rules . 要解决此问题,必须指定 patternProperties 部分

    {
        "patternProperties": {
            "^(/[^/]+)+$": { "$ref": "http://some.site.somewhere/entry-schema#" }
    }
    

    该构造指定 pattern to match 对于属性。实例 how to use patternProperties 阅读更多信息 specification

    更新

    实际上,完整的方案一定是这样的

    {
        "$schema": "http://json-schema.org/draft-06/schema#",
        "type": "object",
        "properties": {
            "someString": {
                "type": "string"
            }
        },
        "patternProperties": {
            "^obj([0-9]+)$": {
                "$ref": "#/definitions/objEntity"
            }
        },
        "additionalProperties": false,
        "required": [ "someString" ],
    
        "definitions": {
            "objEntity": {
                "type": "object",
                "properties": {
                    "opt1": { "type": "number" },
                    "opt2": { "type": "number" },
                    "opt3": { "type": "string" }
                },
                "required": ["opt1", "opt2", "opt3"]
            }
        }
    }
    

    当然,您可以将该方案拆分为多个文件,并将链接更改为类型定义。