Validate JSON against JSON Schema C#

匿名 (未验证) 提交于 2019-12-03 02:42:02

问题:

Is there a way to validate a JSON structure against a JSON schema for that structure? I have looked and found JSON.Net validate but this does not do what I want.

JSON.net does:

JsonSchema schema = JsonSchema.Parse(@"{   'type': 'object',   'properties': {     'name': {'type':'string'},     'hobbies': {'type': 'array'}   } }");  JObject person = JObject.Parse(@"{   'name': 'James',   'hobbies': ['.NET', 'LOLCATS'] }");  bool valid = person.IsValid(schema); // true 

This validates to true.

JsonSchema schema = JsonSchema.Parse(@"{   'type': 'object',   'properties': {     'name': {'type':'string'},     'hobbies': {'type': 'array'}   } }");  JObject person = JObject.Parse(@"{   'surname': 2,   'hobbies': ['.NET', 'LOLCATS'] }");  bool valid = person.IsValid(schema); 

This also validates to true

JsonSchema schema = JsonSchema.Parse(@"{   'type': 'object',   'properties': {     'name': {'type':'string'},     'hobbies': {'type': 'array'}   } }");  JObject person = JObject.Parse(@"{   'name': 2,   'hobbies': ['.NET', 'LOLCATS'] }");  bool valid = person.IsValid(schema); 

Only this validates to false.

Ideally I would like it to Validate that there are no fields aka name in there that shouldn't be in there aka surname.

回答1:

I think that you just need to add

'additionalProperties': false 

to your schema. This will stop unknown properties being provided.

So now your results will be:- True, False, False

test code....

void Main() { var schema = JsonSchema.Parse( @"{     'type': 'object',     'properties': {         'name': {'type':'string'},         'hobbies': {'type': 'array'}     },     'additionalProperties': false     }");  IsValid(JObject.Parse( @"{     'name': 'James',     'hobbies': ['.NET', 'LOLCATS']   }"),  schema).Dump();  IsValid(JObject.Parse( @"{     'surname': 2,     'hobbies': ['.NET', 'LOLCATS']   }"),  schema).Dump();  IsValid(JObject.Parse( @"{     'name': 2,     'hobbies': ['.NET', 'LOLCATS']   }"),  schema).Dump(); }  public bool IsValid(JObject obj, JsonSchema schema) {     return obj.IsValid(schema); } 

output :-

True False False 

You could also add "required":true to the fields that must be supplied that way you can return a message with details of missing/invalid fields:-

Property 'surname' has not been defined and the schema does not allow additional     properties. Line 2, position 19.  Required properties are missing from object: name.   Invalid type. Expected String but got Integer. Line 2, position 18.  


回答2:

Ok i hope this will help.

This is your schema:

 public class test {     public string Name { get; set; }     public string ID { get; set; }  } 

This is your validator:

///      /// extension that validates if Json string is copmplient to TSchema.     ///      /// schema     /// json string     /// is valid?     public static bool IsJsonValid(this string value)         where TSchema : new()     {         bool res = true;         //this is a .net object look for it in msdn         JavaScriptSerializer ser = new JavaScriptSerializer();         //first serialize the string to object.         var obj = ser.Deserialize(value);          //get all properties of schema object         var properties = typeof(TSchema).GetProperties();         //iterate on all properties and test.         foreach (PropertyInfo info in properties)         {             // i went on if null value then json string isnt schema complient but you can do what ever test you like her.             var valueOfProp = obj.GetType().GetProperty(info.Name).GetValue(obj, null);             if (valueOfProp == null)                 res = false;         }          return res;     } 

And how to use is:

string json = "{Name:'blabla',ID:'1'}";         bool res = json.IsJsonValid(); 

If you have any question please ask, hope this helps, please take into consideration that this isn't a complete code without exception handling and such...



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!