Validate JSON against JSON Schema C#

前端 未结 2 1588
清酒与你
清酒与你 2020-11-29 05:09

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.

JSO

相关标签:
2条回答
  • 2020-11-29 05:54

    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:

    /// <summary>
        /// extension that validates if Json string is copmplient to TSchema.
        /// </summary>
        /// <typeparam name="TSchema">schema</typeparam>
        /// <param name="value">json string</param>
        /// <returns>is valid?</returns>
        public static bool IsJsonValid<TSchema>(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<TSchema>(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<test>();
    

    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...

    0 讨论(0)
  • 2020-11-29 06:10

    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. 
    
    0 讨论(0)
提交回复
热议问题