使用类型:JSON 模式中的对象和属性

Use of type : object and properties in JSON schema

我是 JSON 的新手。

我在 JSON 的各种示例中看到,如下所示,其中复杂值以 "type":"object", properties { }

为前缀
{
 "$schema": "http://json-schema.org/draft-06/schema#",
 "motor" : { 
  "type" : "object",
  "properties" : {
    "class" : "string",
    "voltage" : "number",
    "amperage" : "number"
  }
 }
}

我写的 JSON 没有类型、对象和属性,如下所示。

{
 "$schema": "http://json-schema.org/draft-06/schema#",
 "motor" : { 
    "class" : "string",
    "voltage" : "number",
    "amperage" : "number"
 }
}

并提交给在线 JSON 模式验证器,没有错误。

type:object, properties { } 的目的是什么?是可选的吗?

是的,它是可选的,请尝试删除它并使用您的验证器。

{
    "$schema": "http://json-schema.org/draft-06/schema#",
    "foo": "bar"
}

实际上你甚至不需要使用 $schema keyword{} 是有效的 json

我首先要了解 json 是什么,https://www.json.org/ is the best place to start but you may prefer something easier to read like https://www.w3schools.com/js/js_json_intro.asp

架构只是一个模板(或定义),用于确保您为消费者生成有效的json

举个例子,假设您有一个应用程序解析一些 json 并查找名为 test_score 的键并将值(分数)保存在数据库中的一些 table/column.对于此示例,我们将调用 table tests 和列 score。由于数据库列需要 type,我们将选择数字类型,即 integer 用于我们的 score 列。

一个有效的json例子可能看起来像

{
 "test_score": 100
}

按照此示例,应用程序将解析键 test_score 并将值 100 保存到 tests.score 数据库 table/column.

但是假设没有分数,所以你输入一个字符串,即 "NA"

{
 "test_score": "NA"
}

当应用程序尝试将 NA 保存到数据库时,它将出错,因为 NA 是一个字符串,而不是数据库期望的整数。

如果您将这些示例中的每一个放入任何在线 json 验证器中,它们都是有效的 json 示例。但是,虽然使用 "NA"100 是有效的 json,但对于需要使用 json.

的实际应用程序是无效的

所以现在你可能明白 json 的作者可能想知道

What are the different valid types I can use as values for my test score?

然后责任落在应用程序的编写者身上,提供客户(作者)可以参考的某种定义(即模式),以便作者确切地知道如何构建 json 所以应用程序可以相应地处理它。拥有架构还允许您 validate/test 您的 json 因此您知道它可以由应用程序处理,而实际上不必通过应用程序发送您的 json。

所以把它放在一起让我们在你看到的模式中说

"$test_score": {
    "type": "integer",
    "format": "tinyint"
},

json 的作者现在知道他们必须传递一个整数并且范围是 0 to 255 因为它是一个 tinyint。他们不再需要错误地尝试不同的值并查看应用程序处理了哪些值。这是拥有模式的一大好处。