如何获取特定JSON值的模式?
众所周知,在oop语言中,我们可以知道实例的类型和实例属性的类型如何获取特定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': {
我认为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'