如何最好地描述JSON数据规范?
过去我使用的是具有“冗长”描述的示例,但感觉不够精确。
似乎有一个新兴的JSON架构标准,但它看起来不是非常活跃的项目。还有其他办法吗?
(更新) 经过数天思考,我喜欢bmargulies建议中使用转换约定的想法。由于这种情况下JSON文档来自.NET Web服务,因此我将简单地使用C#类语法记录模式。这可能不是完全严谨的,但每个人都会理解它,并配合示例尽快传达信息。
如何最好地描述JSON数据规范?
过去我使用的是具有“冗长”描述的示例,但感觉不够精确。
似乎有一个新兴的JSON架构标准,但它看起来不是非常活跃的项目。还有其他办法吗?
(更新) 经过数天思考,我喜欢bmargulies建议中使用转换约定的想法。由于这种情况下JSON文档来自.NET Web服务,因此我将简单地使用C#类语法记录模式。这可能不是完全严谨的,但每个人都会理解它,并配合示例尽快传达信息。
我推荐我的js-schema JavaScript库。它的主要动机与您在问题中描述的相同。它是一种简单易懂的标记,用于描述JSON模式(或规范,如果您想要)。
下面是一个JSON Schema示例:
{
"type":"object",
"properties":{
"id":{
"type":"number",
"required":true
},
"name":{
"type":"string",
"required":true
},
"price":{
"type": "number",
"minimum":0,
"required":true
},
"tags":{
"type":"array",
"items":{
"type":"string"
}
}
}
}
同时使用js-schema获得相同的模式描述:
{
"id" : Number,
"name" : String,
"price" : Number.min(0),
"?tags" : Array.of(String)
}
该库可以根据给定的模式验证对象,生成符合给定模式的随机对象,并进行JSON Schema的序列化/反序列化。
我同意这个说法,但到目前为止,我只尝试过相对简单的结构。Orderly是一种文本格式,用于描述JSON。Orderly可以编译成JSONSchema。它的设计目的是易于阅读和编写。
PERSON <- { "firstname": FIRSTNAMES, "lastname": LASTNAME, "age": AGE, "version": VERSION, "parents" <- PARENTS }
FIRSTNAMES <- [ FIRSTNAME+ ]
FIRSTNAME <- STRING
LASTNAME <- STRING
PARENTS <- [ PERSON{0,2} ]
AGE <- INTEGER
VERSION <- 1 | 2
您需要在某处定义原子类型描述,例如INTEGER和STRING。如果您想为字典添加非硬编码键,则应按以下方式定义:
BREADLOOKUP <- { (TYPE : HOWMANY)+ }
TYPE <- "white" | "dark" | "french" | "croissant"
HOWMANY <- POSITIVE-INTEGER
{ "white": 5,
"french": 2
}
既然正则表达式和BNF都很常见,这可能是一种简单的方法。 ?
、+
、*
、{n}
、{min,max}
是指定元素数量(取自正则表达式)的简单方式,其余部分基本上是纯BNF。
如果你严格执行,甚至可以被解析为验证器。
您可以将W3C XML Schema或一些较少丑陋的模式(如RelaxNG)与转换约定结合使用。