可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
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...