即使存在不同的类型,Json.NET Schema IsValid也会返回true

时间:2018-04-21 17:29:36

标签: c# json json.net jsonschema

我有简单的JSON对象和JSON模式。 JSON对象属性Name是String。在Schema中我期待整数。 IsValid方法返回true。我认为它应该返回false,因为有类型错配。我错过了什么?

//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 个答案:

答案 0 :(得分:2)

您必须在架构的properties属性中定义对象属性,如下所示:

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

.NET Fiddle

答案 1 :(得分:2)

您的架构不正确应该是:

{
  "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();