如何在 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 请求的验证、表单数据的校验等。

相关推荐
canyuemanyue5 分钟前
C++单例模式
开发语言·c++·单例模式
何苏三月6 分钟前
设计模式 - 单例模式(懒汉式、饿汉式、静态内部类、枚举)
java·单例模式
Renas_TJOvO10 分钟前
排序算法汇总
java·数据结构·算法
秋恬意20 分钟前
Java 反射机制详解
java·开发语言
黑不溜秋的23 分钟前
C++ 模板专题 - 标签分派(Tag Dispatching)
开发语言·c++·算法
PleaSure乐事23 分钟前
Ant-Dseign-Pro如何去国际化及删除oneapi.json后出现程序直接结束问题的解决方案
前端·javascript·react.js·前端框架·json·oneapi·antdesignpro
爱上语文28 分钟前
LeetCode每日一题
java·算法·leetcode
skywind33 分钟前
为什么 C 语言数组是从 0 开始计数的?
c语言·开发语言·网络·c++
ღ᭄ꦿ࿐Never say never꧂36 分钟前
重生之我在Java世界------学工厂设计模式
java·设计模式·简单工厂模式·应用场景
尘浮生1 小时前
Java项目实战II基于Spring Boot的火锅店管理系统设计与实现(开发文档+数据库+源码)
java·开发语言·数据库·spring boot·后端·微信小程序·旅游