2

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

2 回答 2

4

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 模式站点对于复杂的模式验证非常有用。

于 2013-07-25T22:09:21.413 回答
2

您也可以AllowAdditionalProperties = falsevalidSchema对象中设置

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

}

于 2017-02-22T17:44:30.047 回答