如何获取特定JSON值的模式?

如何获取特定JSON值的模式?,json,json.net,jsonschema,json-schema-validator,Json,Json.net,Jsonschema,Json Schema Validator,众所周知,在oop语言中,我们可以知道实例的类型和实例属性的类型 我认为JSON值就像JSON模式的一个实例。那么,是否有任何解决方案可以获取每个JSON值的子模式 例如,我手头有JSON模式和JSON实例,如下所示: { 'definitions': { 'img': { 'type': 'object', 'properties': { 'url': {

众所周知,在oop语言中,我们可以知道实例的类型和实例属性的类型

我认为JSON值就像JSON模式的一个实例。那么,是否有任何解决方案可以获取每个JSON值的子模式

例如,我手头有JSON模式和JSON实例,如下所示:

{
    'definitions': {
        'img': {
            'type': 'object',
            'properties': {
                'url': {
                    'type': 'string'
                }
            }
        }
    },
    'type': 'object',
    'properties': {
        'name': {
            'type':'string'
        },
        'avatar': {
            '$ref': '#/definitions/img'
        }
    }
}
以及JSON实例:

var json =
{
  'name': 'James',
  'avatar': {'url':'http://xxxx.jpg'}
}
当我以编程方式访问json.avatar时,如何获取头像类型为“img”


顺便说一句,我正在使用。

当试图解决这个问题时,一件重要的事情是Jschema在何处以及如何存储定义,并且您可以通过类似于JObject的模式进行移动

因此,假设您这样加载模式(使用Newtonsoft):

当访问模式的avatar属性时,实际上您将得到已替换的带有定义的链接(因为Jschema在解析过程中正在替换它)。但是定义本身并没有丢失,而是存储在
schema.ExtensionData[“definitions”]
中—这在一开始让我感到惊讶—您可以像标准作业对象一样访问这些定义

在某些条件下(例如,使用url标记的单个定义),您可以访问实际定义类型:

        var avatarKey = schema.Properties["avatar"].Properties.Keys.Single(); //'url'
        var definitions = schema.ExtensionData["definitions"]; 
然后获取包含url的定义并获取根名称(场景中的img):


这不是每个模式的通用解决方案,但基于此,您可以调整它以满足更复杂的需求。

解决此问题时,一个重要的问题是Jschema存储定义的位置和方式,并且您可以像JObject一样在模式中移动

因此,假设您这样加载模式(使用Newtonsoft):

当访问模式的avatar属性时,实际上您将得到已替换的带有定义的链接(因为Jschema在解析过程中正在替换它)。但是定义本身并没有丢失,而是存储在
schema.ExtensionData[“definitions”]
中—这在一开始让我感到惊讶—您可以像标准作业对象一样访问这些定义

在某些条件下(例如,使用url标记的单个定义),您可以访问实际定义类型:

        var avatarKey = schema.Properties["avatar"].Properties.Keys.Single(); //'url'
        var definitions = schema.ExtensionData["definitions"]; 
然后获取包含url的定义并获取根名称(场景中的img):

这不是每个模式的通用解决方案,但基于此,您可以调整它以满足更复杂的需求

        var matching = definitions.SelectTokens($"..{avatarKey}");
        var avatarDefinition = matching.Single().Root;
        var avatarType = (avatarDefinition.First() as JProperty).Name; //'img'