【问题标题】:JSON.Net schema validation not flagging additional properties?JSON.Net 模式验证没有标记其他属性?
【发布时间】:2012-11-21 22:55:21
【问题描述】:

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

【问题讨论】:

  • 你找到这个问题的答案了吗?我也想知道。谢谢。
  • 你能更新标签吗?您的问题不依赖于语言,而只依赖于 jsonschema 规范。

标签: json.net jsonschema


【解决方案1】:

将架构上的 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 对于复杂的架构验证非常有用。

【讨论】:

    【解决方案2】:

    你也可以在validSchema对象中设置AllowAdditionalProperties = false

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

    }

    【讨论】:

      猜你喜欢
      • 2011-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-14
      • 1970-01-01
      • 1970-01-01
      • 2020-06-04
      • 1970-01-01
      相关资源
      最近更新 更多