如何在 JSON 中编写“anyOf”语句?

在 JSON 中,anyOf 语句通常用于 JSON Schema(JSON 模式)中,来定义多个可能的模式,表示数据可以匹配多个子模式中的任意一个。这种功能常用于验证 JSON 数据是否符合某一组可能的条件之一。

1、问题背景

问题:如何编写 JSON 使其符合给定的 JSON Schema 结构?在 JSON Schema 中,存在一个"anyOf"关键字,要求至少满足一个条件。

2、解决方案

为了符合给定的 JSON Schema 结构,需要对 JSON 进行以下修改:

  • 使用anyOf关键字可以确保至少满足一个条件。
python 复制代码
special_needs = [
    {
        "main": ["learning"],
        "sub": ["ADD/ADHD"]
    },
    {
        "main": ["behavioral"]
    }
]
  • mainsub属性需要放在同一个对象中。
python 复制代码
special_needs = [
    {
        "category_0": {
            "main": ["learning"],
            "sub": ["ADD/ADHD", "dyslexia", "general learning disability", "language disorder", "intellectual giftedness", "other"]
        }
    },
    {
        "category_1": {
            "main": ["mental"],
            "sub": ["down's syndrome", "asperger's syndrome", "autism", "other"]
        }
    },
    {
        "category_2": {
            "main": ["behavioral"]
        }
    },
    {
        "category_3": {
            "main": ["medical"],
            "sub": ["diabetes", "allergies", "eating disorders", "chronic illness", "other"]
        }
    },
    {
        "category_4": {
            "main": ["physical"],
            "sub": ["blind", "deaf", "cerebral palsy", "other"]
        }
    }
]
  • 将JSON中的dict改为[],这样才符合anyOf中的要求。
python 复制代码
special_needs = [
    {
        "category_0": {
            "main": ["learning"],
            "sub": ["ADD/ADHD", "dyslexia", "general learning disability", "language disorder", "intellectual giftedness", "other"]
        }
    },
    {
        "category_1": {
            "main": ["mental"],
            "sub": ["down's syndrome", "asperger's syndrome", "autism", "other"]
        }
    },
    {
        "category_2": {
            "main": ["behavioral"]
        }
    },
    {
        "category_3": {
            "main": ["medical"],
            "sub": ["diabetes", "allergies", "eating disorders", "chronic illness", "other"]
        }
    },
    {
        "category_4": {
            "main": ["physical"],
            "sub": ["blind", "deaf", "cerebral palsy", "other"]
        }
    }
]
  • anyOf仅适用于数组类型,因此special_needs应该是一个数组。
python 复制代码
special_needs = [
    {
        "category_0": {
            "main": ["learning"],
            "sub": ["ADD/ADHD", "dyslexia", "general learning disability", "language disorder", "intellectual giftedness", "other"]
        }
    },
    {
        "category_1": {
            "main": ["mental"],
            "sub": ["down's syndrome", "asperger's syndrome", "autism", "other"]
        }
    },
    {
        "category_2": {
            "main": ["behavioral"]
        }
    },
    {
        "category_3": {
            "main": ["medical"],
            "sub": ["diabetes", "allergies", "eating disorders", "chronic illness", "other"]
        }
    },
    {
        "category_4": {
            "main": ["physical"],
            "sub": ["blind", "deaf", "cerebral palsy", "other"]
        }
    }
]

代码示例:

python 复制代码
import json

# 创建一个包含"anyOf"关键字的 JSON Schema
schema = {
    "$schema": "http://json-schema.org/draft-04/schema#",
    "type": "object",
    "properties": {
        "special_needs": {
            "type": "array",
            "items": {
                "anyOf": [
                    {
                        "properties": {
                            "category_0": {
                                "type": "object",
                                "properties": {
                                    "main": {
                                        "type": "array",
                                        "items": {
                                            "type": "string",
                                            "enum": ["learning"]
                                        }
                                    },
                                    "sub": {
                                        "type": "array",
                                        "items": {
                                            "type": "string",
                                            "enum": ["ADD/ADHD", "dyslexia", "general learning disability", "language disorder", "intellectual giftedness", "other"]
                                        }
                                    }
                                }
                            }
                        }
                    },
                    {
                        "properties": {
                            "category_1": {
                                "type": "object",
                                "properties": {
                                    "main": {
                                        "type": "array",
                                        "items": {
                                            "type": "string",
                                            "enum": ["mental"]
                                        }
                                    },
                                    "sub": {
                                        "type": "array",
                                        "items": {
                                            "type": "string",
                                            "enum": ["down's syndrome", "asperger's syndrome", "autism", "other"]
                                        }
                                    }
                                }
                            }
                        }
                    },
                    {
                        "properties": {
                            "category_2": {
                                "type": "object",
                                "properties": {
                                    "main": {
                                        "type": "array",
                                        "items": {
                                            "type": "string",
                                            "enum": ["behavioral"]
                                        }
                                    }
                                }
                            }
                        }
                    },
                    {
                        "properties": {
                            "category_3": {
                                "type": "object",
                                "properties": {
                                    "main": {
                                        "type": "array",
                                        "items": {
                                            "type": "string",
                                            "enum": ["medical"]
                                        }
                                    },
                                    "sub": {
                                        "type": "array",
                                        "items": {
                                            "type": "string",
                                            "enum": ["diabetes", "allergies", "eating disorders", "chronic illness", "other"]
                                        }
                                    }
                                }
                            }
                        }
                    },
                    {
                        "properties": {
                            "category_4": {
                                "type": "object",
                                "properties": {
                                    "main": {
                                        "type": "array",
                                        "items": {
                                            "type": "string",
                                            "enum": ["physical"]
                                        }
                                    },
                                    "sub": {
                                        "type": "array",
                                        "items": {
                                            "type": "string",
                                            "enum": ["blind", "deaf", "cerebral palsy", "other"]
                                        }
                                    }
                                }
                            }
                        }
                    }
                ]
            }
        }
    }
}

# 创建一个符合 JSON Schema 的 JSON 数据
data = {
    "special_needs": [
        {
            "category_0": {
                "main": ["learning"],
                "sub": ["ADD/ADHD"]
            }
        },
        {
            "category_1": {
                "main": ["mental"],
                "sub": ["down's syndrome"]
            }
        }
    ]
}

# 验证 JSON 数据是否符合 JSON Schema
validator = jsonschema.Draft4Validator(schema)
if validator.is_valid(data):
    print("JSON data is valid")
else:
    print("JSON data is invalid")

# 输出 JSON 数据
print(json.dumps(data, indent=4))

运行代码输出如下:

python 复制代码
JSON data is valid
{
    "special_needs": [
        {
            "category_0": {
                "main": [
                    "learning"
                ],
                "sub": [
                    "ADD/ADHD"
                ]
            }
        },
        {
            "category_1": {
                "main": [
                    "mental"
                ],
                "sub": [
                    "down's syndrome"
                ]
            }
        }
    ]
}

总结

  • anyOf 允许定义多个可能的模式,数据只需符合其中之一即可。
  • 它在 JSON Schema 中用于灵活的验证场景,尤其当字段可以有多种可能的结构时。

这种模式非常适合需要灵活数据验证的场景,比如 API 请求的验证、表单数据的校验等。

相关推荐
Dicky-_-zhang1 小时前
系统容量规划与压测实战:从1万到100万QPS的科学扩容
java·jvm
Highcharts.js6 小时前
倒置百分比堆叠面积图表示列详解|Highcharts大气成分图表代码
开发语言·信息可视化·highcharts·图表开发·面积图·图表示例·推叠图
csdn_aspnet7 小时前
C语言 Lomuto分区算法(Lomuto Partition Algorithm)
c语言·开发语言·算法
Dicky-_-zhang7 小时前
消息队列Kafka/RocketMQ选型与高可用架构:从单体到100万TPS的演进
java·jvm
晨曦中的暮雨7 小时前
4.15腾讯 CSIG云服务产线 一面
java·开发语言
2301_781571427 小时前
Golang格式化输出占位符都有什么_Golang fmt占位符教程【通俗】
jvm·数据库·python
存在morning7 小时前
【GO语言开发实践】二 GO 并发快速上手
大数据·开发语言·golang
fake_ss1987 小时前
AI时代学习全栈项目开发的新范式
java·人工智能·学习·架构·个人开发·学习方法
养肥胖虎7 小时前
RAG学习笔记(3):区分数据库检索与RAG的使用场景
数据库·ai·rag
茉莉玫瑰花茶7 小时前
工作流的常见模式 [ 1 ]
java·服务器·前端