有没有办法针对该结构的JSON模式验证JSON结构?我已经查看并发现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
这证实为真。
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。
理想情况下,我希望验证在那里不存在名为name
的字段,而不应该在那里surname
。
答案 0 :(得分:13)
我认为你只需要添加
'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.
答案 1 :(得分:3)
好的,我希望这会有所帮助。
这是您的架构:
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>();
如果您有任何疑问,请询问,希望这有帮助,请考虑到这不是一个完整的代码,无需例外处理等......
答案 2 :(得分:1)
我只是添加简短的答案,使用来自 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);
}