Python 检测json模式是否具有模式类型

Python 检测json模式是否具有模式类型,python,json,jsonschema,json-schema-validator,Python,Json,Jsonschema,Json Schema Validator,我想检查一个模式中是否只有一个模式,或者其中是否有多个具有oneOf属性的模式 python代码应该是这样的 If schema1 has oneOf property: Some code1 If schema1 is just a single schema: Some code2 本质上,我希望能够区分这两种模式 方案1 "schema1": { "definitions": { "schema": { "type": "o

我想检查一个模式中是否只有一个模式,或者其中是否有多个具有oneOf属性的模式

python代码应该是这样的

If schema1 has oneOf property:
    Some code1
If schema1 is just a single schema:
    Some code2
本质上,我希望能够区分这两种模式

方案1

"schema1": {
    "definitions": {
        "schema": {
            "type": "object",
            "properties": {
                "name": {
                    "type": ["string", "null"]
                }
            }
        }
    }
}
方案2

"schema2": {
    "definitions": {
        "schema": {
            "oneOf": [
            {
                "type": ["null"]
            },
            {
                "type": ["string"],
                "enum": ["NONE"]
            }
            ]
        }
    }
}
如何在Python中实现这一点


编辑:更正了我的示例模式

下面是一个示例,展示了一种递归检查所提供的json中是否有oneOf属性的方法。如果您特别希望只检查json的“schema”部分,则需要检查parent属性

#!/usr/bin/env python

import json


def objectHasKey(object_,key_):
    _result = False 
    if (type(object_)==dict):
        for _key in object_.keys():
            print _key
            if (type(object_[_key])==dict):
                _dict = object_[_key]
                _result = objectHasKey(_dict,key_)
            if _key == key_:
                _result = True
            if _result:
                break
    return _result

firstJSONText = '''
{
    "definitions": {
        "schema": {
            "type": "object",
            "properties": {
                "name": {
                    "type": [
                        "string",
                        "null"
                    ]
                }
            }
        }
    }
}
'''

first = json.loads(firstJSONText)

secondJSONText = '''
{
    "definitions": {
        "schema": {
            "oneOf": [
                {
                    "type": [
                        "null"
                    ]
                },
                {
                    "type": [
                        "string"
                    ],
                    "enum": [
                        "NONE"
                    ]
                }
            ]
        }
    }
}
'''

second = json.loads(secondJSONText)

target = first

if objectHasKey(target,'oneOf'):
    print "Handle oneOf with first"
else:
    print "Handle default with first"

target = second

if objectHasKey(target,'oneOf'):
    print "Handle oneOf with second"
else:
    print "Handle default with second"
带有输出的示例调用

csmu-macbook-pro-2:detect-if-a-json-schema-has-a-oneof-type-schema admin$ ./test-for-schema.py 
definitions
schema
type
properties
name
type
Handle default with first
definitions
schema
oneOf
Handle oneOf with second

这些模式看起来“错误”——它们是您正在使用的实际模式吗。。。如果是这样,对象本身会显式地声明它们是哪个模式。如果不是。。请给出一些示例数据,在这些数据中,您必须确定哪个模式已就位。@KeithJohnHutchison我已更正了问题中的示例模式。这不是我使用的确切模式,但与之类似。我的编辑现在纠正了模式还是仍然错误?只是一个简短的说明。从我在代码中看到的任何“其中之一”都可以在树下找到。因此,它可能不属于您正在查看的(子)模式。该代码不适用于$ref。