我正在使用NewtonSoft.JSON进行一些JSON模式验证。我看到如果 JSON 具有比架构中指定的数据更多的数据,则验证将返回"ISValid=true"。代码和数据如下。架构没有名为"city"的属性的属性定义,传入的 JSON 数据具有该属性及其值。我希望下面的 IsValid 调用返回 false,但它返回 true。架构或类上是否有设置(例如"强制严格"或类似设置),这些设置将强制数据具有架构中指定的所有且仅数据?
public static void ValidateJsonSchema(string expectedSchema, string actualData)
{
JsonSchema validSchema = JsonSchema.Parse(expectedSchema);
JObject actualJson = JObject.Parse(actualData);
IList<string> messages;
if (!actualJson.IsValid(validSchema, out messages))
{
throw new Exception("Returned data JSON schema validation failed." + messages.ToXml());
}
}
将架构上的 additionalProperties
属性设置为 false,以便在正在验证的数据上有其他属性时验证将失败。
例如,如果您使用街道名称和编号而不是城市来验证地址,则它如下所示:
{
"title": "Address",
"type": "object"
"additionalProperties": false,
"properties": {
"streetName": {
"type": "string"
},
"streetNum": {
"type": "integer"
}
}
}
上述内容将确保如果数据中存在任何其他属性,验证将失败。但是,如果您缺少属性(例如街道名称),它仍然会通过验证。若要确保指定的所有属性都存在,请对每个属性使用 required
,如下所示:
{
"title": "Address",
"type": "object"
"additionalProperties": false,
"properties": {
"streetName": {
"type": "string",
"required": true
},
"streetNum": {
"type": "integer",
"required": true
}
}
}
以上将确保数据包含每个属性,并且仅包含这些属性。
作为附带的,我一直无法找到特定于 JSON.Net 和架构验证的任何信息,但发现 json 架构站点对于复杂的架构验证非常有用。
对象中设置AllowAdditionalProperties = false
validSchema
public static void ValidateJsonSchema(string expectedSchema, string actualData)
{
JsonSchema validSchema = JsonSchema.Parse(expectedSchema);
validSchema.AllowAdditionalProperties = false;
JObject actualJson = JObject.Parse(actualData);
IList<string> messages;
if (!actualJson.IsValid(validSchema, out messages))
{
throw new Exception("Returned data JSON schema validation failed." + messages.ToXml());
}
}