与自定义json模式相关的一些问题

问题描述:

我很喜欢json。在定义我的RESTful API结果(即JSON)的格式时,我觉得将它记录为我自己的JSON schema会更容易。虽然写了一个我有几个问题:与自定义json模式相关的一些问题

  1. 在我的结果JSON中,如何指定它确认的模式的URI? --edit--它是否使用$schema属性?
  2. JSON模式版本控制是否有任何约定/准则?是否有一些属性应该/可以在我的模式中定义为属性?我看到JSON schema itself没有定义版本,除了它的URI被指定为密钥$schema的值。
  3. 我可以将我的一个BIG JSON模式分解为多个较小的模式并将其包含在另一个中?像C++中的#include一样,然后参考我作为结果发送给用户的JSON中的多个模式。
  4. 我可以为键“type”定义一个自定义值吗?例如。我想重用“日期”这样的定义:

[忽略此行,它的获取格式为以下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 
        } 
       } 
      } 
     } 
    } 
} 

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

  1. 正如您正确地指出,$schema可用于指定它符合的架构。
  2. 实际上,我在使用JSON模式版本化搜索时发现了这个主题,并且使用URI进行版本化的想法听起来合乎逻辑。
  3. 您可以使用$ref链接到另一个架构,然后插入。
  4. 再次,您可以使用$refJSON Pointer从其他模式导入定义。

你总是可以通过validating来测试你的模式,看看你是否犯了错误。

该规范似乎在暗示你可以:

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

它,然后继续讨论最小执行什么验证器可能做。

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

我认为你的文件包含Q应该在json之外处理,例如,有一个开发步骤,可以通过脚本/模板(例如erb或其他)合并您的子文件来生成完整的json。在我看来,您的服务应始终提供完整的json,以便与该服务充分交互。如果这从客户的角度来看难以管理,这可能是重构和引入另一项服务的信号。

+0

似乎有太多的工作,所以我不会去做。但是,是的,这是一个可行的选择,尤其是在今天的tech-env中,我一定会找到可以在任何语言/环境中执行此操作的工具。谢谢。 – Kashyap

+0

在JSON模式的v4中,这似乎不被允许了:http://json-schema.org/latest/json-schema-validation.html#anchor79 – Mitar

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

再加上你的出生日期定义不包含日期似乎是错误的。

+0

谢谢。问题更多的是要了解如何定义自定义结构,而不是如何定义'date',这仅仅是一个示例。 – Kashyap

+0

@artemoboturov到#5.23的链接对JSON Schema Draft 3有效,但在最新的“稳定草案”04中不存在。 [第7.3.1节中的JSON模式验证文档](http://json-schema.org/latest/json-schema-validation.html#anchor108)声明值为“date-time”的“format”。遗憾的是没有“约会”。 –

在撰写本文时,当前版本的JSON架构规范的时间草案-V4,其中,用于string实例格式date-timeclearly specified,并在实践中是非常有用的。

有至今没有定义简单的格式date,但你可以很容易地定义你的对象的属性为string类型,然后在它上面的应用formatpattern validation(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}$" 
     } 
    } 
} 
+0

但是如果他有birth_date和death_date以及join_date和last_modified_date等等......那么,那么到处复制模式呢? –