我正在使用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());
}
}
答案 0 :(得分:3)
将架构上的additionalProperties
属性设置为false,以便在您要验证的数据上有其他属性时验证将失败。
例如,如果您要验证的是街道名称和号码但不是城市的地址,那么它将如下所示:
{
"title": "Address",
"type": "object"
"additionalProperties": false,
"properties": {
"streetName": {
"type": "string"
},
"streetNum": {
"type": "integer"
}
}
}
如果数据中存在任何其他属性,上述操作将确保验证失败。但是,如果您缺少属性(例如streetName),它仍将通过验证。要确保指定的所有属性都存在,请在每个属性上使用required
,如下所示:
{
"title": "Address",
"type": "object"
"additionalProperties": false,
"properties": {
"streetName": {
"type": "string",
"required": true
},
"streetNum": {
"type": "integer",
"required": true
}
}
}
以上内容将确保数据包含每个属性,并且只包含那些属性。
作为一个方面,我一直无法找到任何特定于JSON.Net和架构验证的信息,但发现json架构site对于复杂的架构验证非常有用。
答案 1 :(得分:0)
您还可以在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());
}
}