C# 根据JSON模式C验证JSON#

C# 根据JSON模式C验证JSON#,c#,json,validation,jsonschema,C#,Json,Validation,Jsonschema,有没有办法根据JSON架构验证JSON结构?我已经查找并找到了JSON.NETValidate,但这并不是我想要的 是否: 这验证了这一点 JsonSchema schema = JsonSchema.Parse(@"{ 'type': 'object', 'properties': { 'name': {'type':'string'}, 'hobbies': {'type': 'array'} } }"); JObject person = JObject.Pa

有没有办法根据JSON架构验证JSON结构?我已经查找并找到了JSON.NETValidate,但这并不是我想要的

是否:

这验证了这一点

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);
这也验证了这一点

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


理想情况下,我希望它能够验证其中没有字段aka
name
不应该在那里aka
姓氏
好的,我希望这会有所帮助

这是您的模式:

 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;
    }
//
///验证Json字符串是否为TSchema的copmplient的扩展。
/// 
///模式
///json字符串
///有效吗?
公共静态bool IsJsonValid(此字符串值)
其中TSchema:new()
{
bool res=真;
//这是一个.net对象。请在msdn中查找它
JavaScriptSerializer ser=新的JavaScriptSerializer();
//首先将字符串序列化为对象。
var obj=序列反序列化(值);
//获取架构对象的所有属性
var properties=typeof(TSchema).GetProperties();
//迭代所有属性并进行测试。
foreach(属性中的属性信息)
{
//我接着说,如果值为null,那么json字符串不是模式complient,但您可以做任何您喜欢的测试。
var valueOfProp=obj.GetType().GetProperty(info.Name).GetValue(obj,null);
如果(valueOfProp==null)
res=假;
}
返回res;
}
如何使用是:

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

如果您有任何问题,请询问,希望这有帮助,请考虑到这不是一个没有异常处理的完整代码,我认为您只需要添加

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

我只是使用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);
    }
公共静态bool IsJsonValid>(字符串值)
{
JSchemaGenerator生成器=新的JSchemaGenerator();
JSchema schema=generator.Generate(typeof(TSchema));
schema.AllowAdditionalProperties=false;
JObject obj=JObject.Parse(值);
返回obj.IsValid(schema);
}

是否要验证字符串(模式)与字符串(给定对象)的对比,或者是否可以使用对象作为模式?是的,类似于模式
..{'Name':string,'Cars':int..}
与对象
..{'Name':Bob,'Pants':2..}
为false,但
..{'Name':Bob,…}
为true。我会得到一个JSON字符串,我需要将它与数据库中的模式进行比较,以确保它是有效的,是否该模式是您拥有的C#对象,并且您希望根据传入的未知字符串对其进行测试?我不确定是否正确理解您的意思,但这里是这样的:我输入了一个未知字符串,并希望将其与我拥有的模式字符串进行比较。听起来好像是关于你的问题。嗨,谢谢你的回复。问题是(我理解你的代码是如何工作的,如果我的理解是错误的,或者有另一种方法,请解释)我们没有shcema的C#类/对象。它是存储在数据库中的模式字符串。可以有很多很多不同的模式,所以我们不能为它们全部创建对象。这就是为什么我问模式是字符串还是可以是对象,我会尝试进行更改以满足您的需要。@Shaungreenewald嘿,对不起,最近有很多时间,问题解决了?嗨,不,我还没有解决它。我试着在两个字符串上查找和比较字符串/正则表达式。是的,但我现在有点卡住了。我的想法是在key:value上进行正则表达式匹配,并将其放入一个列表中,然后将这两个列表相互比较(如果传入的json键名与模式中的任何一个都不匹配,则无效),而不是为此使用“additionalProperties”,目前鼓励使用“propertyNames”(从草案06开始)。它将执行完全相同的工作(仅允许属性的键在符合模式的enum cor中登记)。另请参见:并考虑:
“propertyNames”:{“enum”:[“name”,“cabiods”]}
而不是“additionalProperties”。
 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);
    }