2

NewtonSoft.JSONを使用してJSONスキーマの検証を行っています。JSONにスキーマで指定されているデータよりも多くのデータがある場合、検証で「ISValid=true」が返されることがわかります。コードとデータは以下のとおりです。スキーマには「city」と呼ばれるプロパティのプロパティ定義がありません。来るJSONデータにはプロパティとその値があります。以下のIsValid呼び出しはfalseを返すと思いますが、trueを返します。スキーマまたはクラスに「Enforcestrict」などの設定があり、データにスキーマで指定されたすべてのデータのみが含まれるようになりますか?

   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 に答える