【发布时间】:2019-08-09 01:09:49
【问题描述】:
我有一个像这样的 json 对象:
{
"session": {
"session_id": "A",
"start_timestamp": 1535619633301
},
"sdk": {
"name": "android",
"version": "21"
}
}
sdk name 可以是 android or ios。而session_id 是基于sdk json 中的name field。我使用条件语句(使用草案 7)编写了json schema,如下所示:
但它以一种意想不到的方式工作:
{
"$schema": "http://json-schema.org/draft-07/schema#",
"$ref": "#/definitions/Base",
"definitions": {
"Base": {
"type": "object",
"additionalProperties": false,
"properties": {
"session": {
"$ref": "#/definitions/Session"
},
"sdk": {
"$ref": "#/definitions/SDK"
}
},
"title": "Base"
},
"Session": {
"type": "object",
"additionalProperties": false,
"properties": {
"start_timestamp": {
"type": "integer",
"minimum": 0
},
"session_id": {
"type": "string",
"if": {
"SDK": {
"properties": {
"name": {
"enum": "ios"
}
}
}
},
"then": {
"pattern": "A"
},
"else": {
"pattern": "B"
}
}
},
"required": [
"session_id",
"start_timestamp"
],
"title": "Session"
},
"SDK": {
"type": "object",
"additionalProperties": false,
"properties": {
"version": {
"type": "string"
},
"name": {
"type": "string",
"enum": [
"ios",
"android"
]
}
},
"required": [
"name",
"version"
],
"title": "SDK"
}
}
}
所以下面的 JSON 通过了:
{
"session": {
"session_id": "A",
"start_timestamp": 1535619633301
},
"sdk": {
"name": "ios",
"version": "21"
}
}
但这失败了:
{
"session": {
"session_id": "B",
"start_timestamp": 1535619633301
},
"sdk": {
"name": "android",
"version": "21"
}
}
有人可以解释一下吗?..即使这样也通过了:
{
"session": {
"session_id": "A",
"start_timestamp": 1535619633301
},
"sdk": {
"name": "android",
"version": "21"
}
}
【问题讨论】:
-
JSON Schema中的
if关键字,值必须是JSON Schema。目前,如果您要在架构中获取if的值,并将其用作 JSON 架构,您期望会发生什么?你看到问题了吗? =](如果没有,这里是为了进一步提供帮助,但我觉得这是一个简单的误解。) -
@Relequestual 你能详细说明一下吗?我没有看到问题
-
当然。我已将架构复制到一个要点,以便我可以参考行号:gist.github.com/Relequestual/…
-
我明白你在说什么。但是我从这里验证了 if 语句的语法:json-schema.org/understanding-json-schema/reference/…。我引用 SDK 名称字段的方式是否错误?
标签: json schema jsonschema json-schema-validator