我试图弄清楚应该如何实现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}}的表单实现模式?
答案 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关键字就足够了。