JSON.Net模式验证没有标记其他属性?

时间:2012-11-21 22:55:22

标签: json.net jsonschema

我正在使用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());
       }
   }

2 个答案:

答案 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());
   }

}