【问题标题】:Are JSON schemas necessary for defining the structure of a JSON?定义 JSON 的结构是否需要 JSON 模式?
【发布时间】:2014-08-14 20:11:19
【问题描述】:

我之所以这么问,是因为我看到当前的 JSON 架构草案 (http://json-schema.org/) 建议通过以下方式使用 JSON 架构:

对于 JSON:

{
 "a":"abc"
 "b": 123
}

草案中提出的架构是这样的

{
 "type":"object"
 "properties":{
  "a": {"type":"string"}
  "b": {"type":"integer"}
 }
}

我的问题是 JSON 本身没有定义它的结构吗?是否需要单独的架构?

草案提出的架构验证了具有上述结构的 JSON,并且这些 JSON 始终是格式

{
 "a":"string"
 "b": 1 (or some number)
}

那么 JSON 需要一个单独的模式是什么?我们也可以简单地使用 JSON 来定义其结构。

PS。我知道我们可以通过草案中提出的模式对 JSON 可以采用的值指定一些限制,但是从定义 JSON 结构的角度来看,建议的模式是否必要?

【问题讨论】:

    标签: json schema jsonschema


    【解决方案1】:

    JSON 本身不定义结构。例如,我可以这样写:

    {
      "a": "string",
      "b": "another string"
    }
    

    这也是有效的 JSON - 但它是“不同结构”的 JSON,因为 "b" 现在是一个字符串。但是您的 API 可能只接受具有特定结构的 JSON,因此虽然它是有效的 JSON,但它不是您需要的形状。

    现在,您需要 JSON Schema 来定义 JSON 数据的结构吗?不,你可以说:

    值必须是一个对象。它必须有两个属性:

    • "a" - 必须是字符串
    • "b" - 必须是整数

    程序员可以很容易地理解这一点,没有曲折的括号或任何东西。

    但是,机器可读格式描述有很多好处,因为它可以让您自动化各种事情(例如测试、生成文档、生成代码/类等)


    编辑: 正如 cmets 中所指出的,您可以从一些示例数据中获取类型信息,并将其用作其他数据的模型。在这种情况下,您基本上将示例数据用作超基本模式。

    对于非常简单的约束(基本类型),这是可行的。但是,您怎么说"b" 必须是整数而不是浮点数?你怎么说"b"必须> 0?怎么说"a"一定不能是空字符串("")?

    确实有一些工具可以从示例数据生成基本 JSON 架构 - 但是,生成的架构通常需要进行一些调整才能实际描述格式(例如最小/最大、必需/可选属性等)。

    【讨论】:

    • 但是查看JSON,可以推断出数量的类型。所以我可以说JSON实例本身包含了类型和结构的信息
    • 类型可以通过以下方式推导: 1.如果值有引号包围,它是一个字符串(“abc”) 2.如果值是真/假(不带引号)那么它是一个布尔值 3。如果它是 null(不带引号),那么它表示 null 4。如果它是一个数字/十进制(不带引号),那么它是一个数字类型
    • 啊,对了 - 所以你说的是检查示例数据,而不是模式?很公平 - 虽然你如何区分整数/浮点数,或指定字符串的最小长度等?
    • 在答案中添加了部分。
    • 是的,我同意如果需要指定额外的限制,例如字符串的长度,或者它应该匹配的正则表达式等,JSON 模式是必要的。但是,如果只有类型和结构信息对我很重要,我可以使用实例本身作为架构,对吗?
    【解决方案2】:

    到目前为止,从来没有必要,在短期内我认为它不会是。

    我个人喜欢 JSON,因为它的简单性、可移植性和灵活性。

    我什至没有看到大品牌使用该架构,所以直到现在他们都没有认真对待它。

    【讨论】:

    • 您认为Heroku 是大品牌吗? :p
    • Google 怎么样(尽管他们使用 v3)?他们还将 JSON Schema 用于 Chrome 中的一些内部内容。
    • 在这种情况下,是时候展望模式了,谈论 API 定义您的实体是一个好习惯。
    • @cloudfeet 你能否给我一些你知道的使用 JSON 模式的系统,以便我可以看到它们提供了什么。提前致谢!
    猜你喜欢
    • 2021-09-05
    • 2016-10-17
    • 1970-01-01
    • 1970-01-01
    • 2019-04-02
    • 2023-01-11
    • 2011-11-02
    • 1970-01-01
    相关资源
    最近更新 更多