在规范中描述JSON数据的最佳方法是什么?
在过去,我使用了'罗嗦'描述的例子,但感觉不精确。
似乎有一个新生的JSON schema标准,但它看起来不像是一个非常活跃的项目。还有其他方法吗?
(更新)在考虑了好几天之后,我喜欢使用转换约定的bmargulies建议。由于本案例中的JSON文档是.NET Web服务的出现,我将简单地用C#类语法记录模式。这可能不是非常严格,但参与的每个人都会理解它,并结合示例将尽快传达信息。
答案 0 :(得分:16)
我会推荐我的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模式进行序列化/反序列化。
答案 1 :(得分:7)
我知道这是一个较旧的问题,但对其他人可能有用: 在寻找描述JSON数据的方法时,我偶然发现Orderly。这是头版的抽象权利:
有序是一种描述JSON的文本格式。有序可以编译成JSONSchema。它的设计易于读写。
我同意这一点,但到目前为止我只用相对简单的结构尝试过它。
答案 2 :(得分:4)
如何使用某种扩展的BNF?
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。
如果你做得足够严格,甚至可以解析验证器。
答案 3 :(得分:1)
您可以将W3C XML Schema或一些不那么丑陋的架构(如RelaxNG)与转换约定相结合。