JSON.Net 架构验证不标记其他属性



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

}

相关内容

  • 没有找到相关文章

最新更新