Как добавить $ ref в JSONSchema? - PullRequest
1 голос
/ 08 января 2012

У меня есть JSONSchema, в которой будут некоторые элементы.Теперь схемы / схемы, которые определяют эти элементы, должны ссылаться в основной схеме?

* one schema that you reference:
 { 
    "id": "http://some.where/sub/schema#", 
    "type": "object", 
    "properties": { 
        "p1": { 
            "type": "integer", 
            "minimum": 12 
        } 
    }     
} 
--- * the main schema: ---- 
{ 
    "id": "http://path.to/base/schema#", 
    "type": "array", 
    "items": { 
        "extends": { 
            "$ref": "http://some.where/sub/schema#/properties/p1" 
        }, 
        "divisibleBy": 5 
    }     
} 

Также обратите внимание, у меня будет несколько элементов в элементе.Я не вижу способ сделать это в API.API также не позволяет мне добавлять пользовательские свойства.Как я могу достичь этого?Я использую JSON.net .

1 Ответ

3 голосов
/ 09 января 2012

Поскольку комментарий будет слишком длинным, я опубликую его как ответ.Но вы должны работать над этим, чтобы настроить в соответствии с вашими потребностями.

string oneSchema = @"{ 
    ""id"": ""http://some.where/sub/schema#"", 
    ""type"": ""object"", 
    ""properties"": { 
        ""p1"": { 
            ""type"": ""integer"", 
            ""minimum"": 12 
        } 
    }     
} ";

string main = @"
{ 
    ""id"": ""http://path.to/base/schema#"", 
    ""type"": ""array"", 
    ""items"": { 
        ""extends"": { 
            ""$ref"": ""http://some.where/sub/schema#/properties/p1"" 
        }, 
        ""divisibleBy"": 5 
    }     
}";

var JObjMain = (JObject)JsonConvert.DeserializeObject(main);
var jObjOther = (JObject)JsonConvert.DeserializeObject(oneSchema);

JToken src = JObjMain["items"]["extends"]["$ref"];
JToken reference = jObjOther["id"];


var path = src.ToString().Replace(reference.ToString(), "").Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
JToken j = jObjOther[path[0]];
for(int i=1;i<path.Length;i++)
{
    j = j[path[i]];
}

src.Replace(j);

Console.WriteLine(JObjMain);
...