如何在规范中描述JSON数据?

49

如何最好地描述JSON数据规范?

过去我使用的是具有“冗长”描述的示例,但感觉不够精确。

似乎有一个新兴的JSON架构标准,但它看起来不是非常活跃的项目。还有其他办法吗?


(更新) 经过数天思考,我喜欢bmargulies建议中使用转换约定的想法。由于这种情况下JSON文档来自.NET Web服务,因此我将简单地使用C#类语法记录模式。这可能不是完全严谨的,但每个人都会理解它,并配合示例尽快传达信息。


你需要一种标准的JSON模式规范,还是一种编写工具以根据规范检查数据的正式方式? - Andrey Vlasovskikh
首先,我希望有一个标准的符号/语法以保持一致性,并且其他阅读规范的人也应该熟悉它。同时,验证样本的工具也非常重要,对于单元测试非常有用。 - Rob Walker
2
无论如何,不要丢失示例。它们是描述模式的最佳方式。但对于所有边角情况,您需要其他东西。 - Marius Gedminas
4个回答

23

我推荐我的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的序列化/反序列化。


8
我知道这是一个比较旧的问题,但它可能对其他人有用: 在寻找描述JSON数据的方法时,我偶然发现了Orderly。以下是主页上的摘要:

Orderly是一种文本格式,用于描述JSON。Orderly可以编译成JSONSchema。它的设计目的是易于阅读和编写。

我同意这个说法,但到目前为止,我只尝试过相对简单的结构。

7
如何使用某种扩展的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。

如果你严格执行,甚至可以被解析为验证器。


这个方案是可行的,但它失去了 JSON 文档的内在嵌套性,而且整体结构需要思考的太多了(至少对我来说是这样的!)。 - Rob Walker
你能否提供一个你想要描述的JSON结构的示例呢? - JeSuisse

1

您可以将W3C XML Schema或一些较少丑陋的模式(如RelaxNG)与转换约定结合使用。


我不熟悉RelaxNG,但我喜欢使用转换约定的想法。 - Rob Walker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接