根据JSON模式C#验证JSON

bttbmeg0  于 2023-02-10  发布在  C#
关注(0)|答案(4)|浏览(218)

有没有一种方法可以针对JSON结构的JSON模式来验证该结构?我已经查找并找到了JSON.Net validate,但这并不能达到我的目的。
JSON.net执行以下操作:

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

这验证为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);

这也验证为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);

只有此验证为false。
理想情况下,我希望它验证那里没有不应该在那里的字段(又名name)。

kmbjn2e3

kmbjn2e31#

我觉得你只需要加上

'additionalProperties': false

添加到架构。这将停止提供未知属性。
所以现在你的结果将是:-正确,错误,错误
测试代码....

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);
}

输出:-

True
False
False

您还可以在必须提供的字段中添加"required":true,这样您就可以返回一条包含缺失/无效字段详细信息的消息:-

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

bfnvny8b2#

好吧,我希望这会有帮助。
这是您的架构:

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

}

这是您的验证器:

/// <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;
    }

而使用方法是:

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

如果你有任何问题,请问,希望这有帮助,请考虑到这不是一个完整的代码没有异常处理等...

bqujaahr

bqujaahr3#

我只是使用Newtonsoft.json.Schema中的JSchemaGenerator添加简短的答案

public static bool IsJsonValid<TSchema>>(string value)
    {
        JSchemaGenerator generator = new JSchemaGenerator();
        JSchema schema = generator.Generate(typeof(TSchema));
        schema.AllowAdditionalProperties = false;           

        JObject obj = JObject.Parse(value);
        return obj.IsValid(schema);
    }
holgip5t

holgip5t4#

public static class RequestSchema
{ 
    public static bool Validate<T>(string requestBody)
    {
        JSchemaGenerator generator = new JSchemaGenerator();
        JSchema schema = generator.Generate(typeof(T));
        JObject jsonObject = JObject.Parse(requestBody);
        bool isValid = jsonObject.IsValid(schema);
        return isValid;
    }
}

And call Method
RequestSchema.Validate<Person>(requestBody)

Reference https://www.newtonsoft.com/jsonschema

相关问题