如何设置我的json架构结构

时间:2014-08-08 14:19:38

标签: jsonschema

我试图弄清楚应该如何实现json架构(尽可能标准化)。

我注意到如果我使用v4草案为表单定义架构,我无法表达我的项目所需的要求。因此,我创建了一个使用v4架构("$schema": "http://json-schema.org/draft-04/schema#")的架构,并为项目提供了自定义ID,我们称之为projectschema#。这个模式验证,因此所有标准都很好。我在type枚举中添加了两个值。

然后,我将此模式用作$schema,用于描述表单属性和验证的另一个模式formschema#。此架构也会验证,这次是针对projectschema#

现在,正如www.json-schema.org上所记录的那样,还有一个允许定义链接的超模式。很有用,因为我可以定义将表单发布到哪里,甚至可以在表单中获取valueSets的位置(即获取用户标题列表的休息服务)。

但是,v4架构本身不支持链接。我看到v4超模式草案如何支持链接,并且引用了v4模式草案,但我无法弄清楚如何实现超模式,这可能意味着我错过了&#的一些基本部分39;如何使用和实现json模式'知识。

我在http://json-schema.org/latest/json-schema-hypermedia.html上找到了以下内容:

  

JSON Schema是一种基于JSON的格式,用于定义JSON数据的结构。本文档指定了JSON Schema的超链接和超媒体相关关键字。

     

术语JSON Hyper-Schema用于指代使用这些关键字的JSON模式。

如果超级架构草案使用草案架构关键字,那么为什么“#”链接会被关联。关键字无处可在架构中找到?

我的(或任何)自定义架构实际上是超架构吗?如果是这样,是否有任何实现称为超级模式的(自定义或草稿)json模式?

我可以解决一百个问题。主要问题:Schema和Hyper Schema之间的关系是什么,以及如何为需要比v4草案中定义的types更多{{1}}的表单实现模式?

2 个答案:

答案 0 :(得分:2)

对不起这个答案的长度。希望它有用。

我也很难理解如何验证Hyper-Schema中的特定链接,因此我将每个链接实现为基本JSON Schema,然后将每个链接与Hyper-Schema绑定在一起。

定义(definitions.json)

{
  "$schema" : "http://json-schema.org/schema#",

  "definitions" : {
    "id" : {
      "type" : "integer",
      "minimum" : 1,
      "exclusiveMinimum" : false
    },

    "foreign_key_id" : {
      "$ref" : "#/definitions/id"
    },

    "season_name" : {
      "type" : "string",
      "minLength" : 1,
      "maxLength" : 1,
      "pattern" : "^[A-T]{1,1}$"
    },

    "currency" : {
      "type" : "integer"
    },

    "shares" : {
      "type" : "integer"
    },

    "username" : {
      "type" : "string",
      "minLength" : 1,
      "maxLength" : 19,
      "pattern" : "^[^ ]{1,19}$"
    },

    "name" : {
      "type" : "string",
      "minLength" : 1,
      "maxLength" : 64,
      "pattern" : "^[A-Za-z0-9][A-Za-z0-9_\\- ]*$"
    },

    "email" : {
      "type" : "string",
      "format" : "email"
    },

    "timestamp" : {
      "type" : "string",
      "format" : "date-time"
    }
  }
}

基础对象架构:

{
  "$schema" : "http://json-schema.org/schema#",

  "type" : "object",

  "properties" : {
    "id" : { "$ref" : "definitions.json#/definitions/id" },
    "season_name" : { "$ref" : "definitions.json#/definitions/season_name" },
    "user_id" : { "$ref" : "definitions.json#/definitions/foreign_key_id" },
    "coins" : { "$ref" : "definitions.json#/definitions/currency" },
    "bonus_coins" : { "$ref" : "definitions.json#/definitions/currency" },
    "created_at" : { "$ref" : "definitions.json#/definitions/timestamp" },
    "updated_at" : { "$ref" : "definitions.json#/definitions/timestamp" }
  },

  "required" : [
    "id",
    "season_name",
    "user_id",
    "coins",
    "bonus_coins",
    "created_at",
    "updated_at"
  ],

  "additionalProperties" : false
}

POST架构(account_request_post.json)

{
  "$schema" : "http://json-schema.org/schema#",

  "type" : "object",

  "properties" : {
    "season_name" : { "$ref" : "definitions.json#/definitions/season_name" },
    "user_id" : { "$ref" : "definitions.json#/definitions/foreign_key_id" }
  },

  "required" : [
    "season_name",
    "user_id"
  ],

  "additionalProperties" : false
}

超级架构:

{
  "$schema" : "http://json-schema.org/schema#",

  "type" : "object",

  "links" : [
    {
      "description" : "Create a new account.",
      "href" : "accounts",
      "method" : "POST",
      "rel" : "create",
      "title" : "Create",
      "schema" : { "$ref" : "account_request_post.json#" }
    },

    {
      "description" : "List accounts.",
      "href" : "accounts",
      "method" : "GET",
      "rel" : "index",
      "title" : "List"
    }
  ]
}

答案 1 :(得分:1)

Json超模式是Json模式标准的一个子集,专用于超链接和超媒体关键字和规则。

The "links" keyword在草案的超架构部分中定义。实际上它是json-schema的一部分(尽管它是在一个特殊的草案部分中定义的)

如果您正在定义API接口,则可能需要使用超级架构。如果您只是定义验证合同,那么普通的Json-schema关键字就足够了。