Json.NET Schema IsValid возвращает true, даже если существует другой тип

Riddlah спросил: 28 марта 2018 в 03:49 в: c#

У меня есть простой объект JSON и схема JSON. Свойство объекта JSON Name - String. И в схеме я ожидаю целое число. Метод IsValid возвращает true. Я думаю, что он должен возвращать false, потому что есть тип missmatch. Мне что-то не хватает?

//json
var hero = new Hero();
hero.Name = "Egid Beyond Meta";
hero.BattleRank = 5000;var output = JsonConvert.SerializeObject(hero);
var deserialized = (Newtonsoft.Json.Linq.JObject)JsonConvert.DeserializeObject(output);        // schema
        string schema = @"{
          'title' : 'Hero',
          'type' : 'object',
          'Name' : {'type' : 'integer'},
          'BattleRank' : {'type' : 'integer'},
          required: [ 'Name', 'BattleRank']
        }";        var jsonSchema = JSchema.Parse(schema);        // returns ture
        Console.WriteLine("is valid " + deserialized.IsValid(jsonSchema));
        Console.ReadLine();

2 ответа

Есть решение
Namoshek ответил: 28 марта 2018 в 04:09

Вы должны определить свойства своих объектов в атрибуте properties схемы следующим образом:

string schema = @"{
    'title' : 'Hero',
    'type' : 'object',
    'properties': {
        'Name' : {'type' : 'integer'},
        'BattleRank' : {'type' : 'integer'},
    },
    required: [ 'Name', 'BattleRank']
}";

.NET Fiddle

ΩmegaMan ответил: 28 марта 2018 в 04:10

Ваша схема неверна, это должно быть:

{
  "type": "object",
  "properties": {
    "Name"      : { "type": ["string"]},
    "BattleRank": { "type": "integer"}
  },
  "required": ["Name","BattleRank"]
}

Генерация схемы вашего класса с использованием генератора имен (Netonsoft.Json.Schema) пространства имен / nuget пакет

JSchemaGenerator generator = new JSchemaGenerator();
JSchema schema = generator.Generate(typeof(Hero));schema.ToString();
Namoshek ответил: 28 марта 2018 в 04:16
Подлинный вопрос: почему для типа Name используется массив?
ΩmegaMan ответил: 28 марта 2018 в 04:31
Дело не в том, что это массив, но он позволяет добавлять к нему другие элементы, такие как "Name" : { "type" : ["string", null]}. В наших тестовых целях это мог быть "Name" : { "type" : "string"}; мой плохой, чтобы оставить его.