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

Rob*_*ker 40 json

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

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

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


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

mol*_*arg 17

我会推荐我的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"
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

以及与js-schema相同的模式描述:

{
  "id"    : Number,
  "name"  : String,
  "price" : Number.min(0),
  "?tags" : Array.of(String)
}
Run Code Online (Sandbox Code Playgroud)

该库能够针对模式验证对象,生成符合给定模式的随机对象,以及对JSON模式进行序列化/反序列化.


Mic*_*ino 7

我知道这是一个较老的问题,但它可能对其他人有用:在寻找描述JSON数据的方法时,我偶然发现了Orderly.这是首页的抽象权:

Orderly是用于描述JSON的文本格式.有序可以编译成JSONSchema.它的设计易于读写.

我同意这一点,但到目前为止我只用相对简单的结构尝试过它.


小智 5

使用某种扩展的 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
Run Code Online (Sandbox Code Playgroud)

您必须在某处定义诸如 INTEGER 和 STRING 之类的原子类型描述的含义。如果你想为字典添加非硬编码键,你可以定义如下:

BREADLOOKUP <- { (TYPE : HOWMANY)+ }

TYPE <- "white" | "dark" | "french" | "croissant"

HOWMANY <- POSITIVE-INTEGER
Run Code Online (Sandbox Code Playgroud)

这将允许像

{ "white": 5, 
  "french": 2
}
Run Code Online (Sandbox Code Playgroud)

由于正则表达式和 BNF 都是众所周知的,这可能是一种简单的方法。?, +, *, {n},{min,max}将是指定多个元素(取自正则表达式)的简单方法,其余部分几乎是纯 BNF。

如果你做得足够严格,它甚至可以被验证器解析。