如何在JSON Schema中引用所有名称任意的嵌套字符串属性?
问题
我希望在JSON Schema中引用所有名称任意的嵌套字符串类型属性。示例数据如下(实际包含更多列):
[ { "var_1": "some_string", "var_2": { "col_1": "x", "col_2": "y", "col_3": "z" }, "var_3": "another_string" } ]
我通过yaml转json工具得到了如下JSON Schema,但我的文件扁平化流程无法获取其中的嵌套信息:
{ "$id": "main.json", "$schema": "http://json-schema.org/draft-07/schema#", "title": "some data", "type": "object", "properties": { "var_1": { "$ref": "another_schema.json#/definitions/var_1" }, "var_2": { "type": "object", "properties": { "fieldNames": { "uniqueItems": true, "type": "array", "items": { "type": "string" } } } }, "var_3": { "type": "string", "description": "another variable" } } }
请问是否存在其他方式可以引用这类名称任意的嵌套字符串属性(如col_1、col_2、col_3)?
解决方案
1. 修正var_2的Schema定义
自动生成的Schema错误地将var_2的嵌套属性定义为fieldNames数组,而实际数据中var_2是一个键名任意、值均为字符串的对象。你需要使用additionalProperties关键字来定义这类结构:
{ "$id": "main.json", "$schema": "http://json-schema.org/draft-07/schema#", "title": "some data", "type": "object", "properties": { "var_1": { "$ref": "another_schema.json#/definitions/var_1" }, "var_2": { "type": "object", // 定义所有任意键名的属性值为字符串 "additionalProperties": { "type": "string" } }, "var_3": { "type": "string", "description": "another variable" } } }
2. 复用任意字符串属性的规则
如果需要在多个地方引用这种“任意键名+字符串值”的对象结构,可以把规则抽离到definitions中,通过$ref复用:
{ "$id": "main.json", "$schema": "http://json-schema.org/draft-07/schema#", "title": "some data", "type": "object", "properties": { "var_1": { "$ref": "another_schema.json#/definitions/var_1" }, "var_2": { "$ref": "#/definitions/arbitraryStringProperties" }, "var_3": { "type": "string", "description": "another variable" } }, "definitions": { "arbitraryStringProperties": { "type": "object", "additionalProperties": { "type": "string" } } } }
3. 适配扁平化流程
修正后的Schema明确了var_2的结构是任意键值对的字符串对象,大部分支持JSON Schema的扁平化工具都能识别additionalProperties关键字,从而遍历所有嵌套属性(如col_1、col_2)进行扁平化处理。如果工具仍不支持,需确认其是否兼容JSON Schema draft-07版本。
内容的提问来源于stack exchange,提问作者alexb523
相关产品推荐
相关产品推荐

