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

时间:2010-07-09 14:10:04

标签: json

在规范中描述JSON数据的最佳方法是什么?

在过去,我使用了'罗嗦'描述的例子,但感觉不精确。

似乎有一个新生的JSON schema标准,但它看起来不像是一个非常活跃的项目。还有其他方法吗?


更新)在考虑了好几天之后,我喜欢使用转换约定的bmargulies建议。由于本案例中的JSON文档是.NET Web服务的出现,我将简单地用C#类语法记录模式。这可能不是非常严格,但参与的每个人都会理解它,并结合示例将尽快传达信息。

4 个答案:

答案 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)与转换约定相结合。