一些与自定义json架构相关的问题

时间:2011-11-20 19:23:19

标签: json jsonschema

我对json说道。在定义我的RESTful API结果的格式(即JSON)时,我觉得将它记录为我自己的JSON schema会更容易。在写一篇文章的时候我几乎没有问题:

  1. 在我的结果JSON中,如何指定它确认的架构的URI? --edit--是否使用$schema属性?
  2. JSON架构版本控制是否有任何约定/指南?我应该/可以在我的架构中定义一些属性作为属性吗?我看到JSON schema itself没有定义版本,除非它的URI指定为键$schema的值。
  3. 我可以将我的一个BIG JSON模式分解为多个较小的模式并包含在另一个中吗?和C ++中的#include一样,然后引用我发送给用户的JSON中的多个模式。
  4. 我可以为键“type”定义自定义值吗?例如。我想重复使用“date”的定义:
  5. [忽略这一行,这是为了让格式化工作跟随json ..]

    {
        "date":{
            "type":"object",
            "properties":{
                "month":{
                    "type":"integer",
                    "minimum":1,
                    "maximum":12
                },
                "year":{
                    "type":"integer",
                    "minimum":0
                }
            }
        },
        "personInfo":{
            "type":"object",
            "properties":{
                "name":{
                    "type":"string"
                },
                "dateOfBirth":{
                    "type":"date"
                }
            }
        },
        "student":{
            "type":"object",
            "properties":{
                "id":{
                    "type":"personInfo"
                },
                "pass_out_year":{
                    "type":"date"
                }
            }
        }
    }
    

    而不是在多个地方提供“日期”属性,如下所示:

    {
        "personInfo":{
            "type":"object",
            "properties":{
                "name":{
                    "type":"string"
                },
                "dateOfBirth":{
                    "type":"object",
                    "properties":{
                        "month":{
                            "type":"integer",
                            "minimum":1,
                            "maximum":12
                        },
                        "year":{
                            "type":"integer",
                            "minimum":0
                        }
                    }
                }
            }
        },
        "student":{
            "type":"object",
            "properties":{
                "id":{
                    "type":"personInfo"
                },
                "pass_out_year":{
                    "type":"object",
                    "properties":{
                        "month":{
                            "type":"integer",
                            "minimum":1,
                            "maximum":12
                        },
                        "year":{
                            "type":"integer",
                            "minimum":0
                        }
                    }
                }
            }
        }
    }
    

    根据5.1类型in the spec,这是不可能的,但它似乎是一个基本的用例!

4 个答案:

答案 0 :(得分:4)

  1. 正如您所知,$schema可用于指定其符合的架构。
  2. 我在google搜索JSON Schema版本时实际上找到了这个主题,并且使用URI进行版本控制的想法听起来很合理。
  3. 您可以使用$ref链接到随后引入的其他架构。
  4. 同样,您可以使用$refJSON Pointer从其他模式导入定义。
  5. 您可以随时通过validating架构测试,看看您是否犯过任何错误。

答案 1 :(得分:3)

在撰写本文时,JSON Schema规范的当前版本为 draft-v4 ,其中date-time个实例的格式string为{{3并且在实践中非常有用。

目前尚未定义更简单的date格式,但您可以轻松地将对象的属性定义为string类型,然后应用format clearly specified (ECMA 262正则表达方言)就在它之上。

例如:

{
    "$schema": "http://json-schema.org/draft-04/schema",
    "title": "Example Schema"
    "description": "This schema contains only a birth date property"
    "type": "object",
    "required": ["birth_date"],
    "properties": {
        "birth_date": {
            "type": "string",
            "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$"
        }
    }
}

答案 2 :(得分:2)

为什么不按照#5.23 in JSON Schema Draft 03使用"format" : "date"

另外,您对出生日期的定义不包含似乎是错误的日期。

答案 3 :(得分:1)

规范似乎暗示你可以:

  

其他类型值可用于自定义目的,......

然后继续讨论最小实现的验证器可能做什么。

在我看来,你想做的事似乎没问题。 将类型引用和类型定义保存在同一文件中可能有助于您的架构清晰。

我认为您的文件包含Q应该在json之外处理,例如有一个dev步骤,从脚本/模板(例如erb或其他类似的)合并你的子文件生成完整的json。在我看来,您的服务应始终提供与该服务完全交互所需的完整json。如果从客户的角度来看这无法管理,则可能是重构和引入其他服务的信号。