スキーマバージョンの指定方法
スキーマのバージョンを指定する方法は2つあります。
1つがJSON Schemaのファイル自体に記載する方法、2つ目がバリデーション時にオプションとして指定する方法です。
JSON Schemaで指定する場合
JSON Schemaで指定する場合は以下のように”$schema”で指定します。
{ "$schema": "https://json-schema.org/draft/2020-12/schema", "type": "object", "properties": { "key1": { "type": "string" } }, "required": ["key1"] }
オプションで指定する場合
バリデーション時にオプションで指定する場合は以下のようにValidationOptions.ValidateAsにスキーマバージョンを指定し、jsonSchema.Validate()に引数で渡してあげます。
var options = new ValidationOptions { ValidateAs = Draft.Draft202012 }; var ret = jsonSchema.Validate(jsonNode, options);
JSON Schemaとオプション両方で指定した場合の優先度
上記のようにスキーマバージョンの指定方法が2つあるため両方指定され、且つ異なるバージョンが指定された場合にどちらのバージョンが使用されるのか気になるところです。
結論から言うとJSON Schemaに記載されている “$schema”: “https://json-schema.org/draft/XXXXX/schema” が一番強いです。
JSON Schemaにさえ書いておけばソース側で間違ったバージョンを指定しても関係ありません。
いくつかのパターンで試したので結果を載せます。
使用したスキーマバージョンは以下の2つです。
- https://json-schema.org/draft/2019-09/schema
- https://json-schema.org/draft/2020-12/schema
JSON Schema | オプション | 結果 |
---|---|---|
2020-12 | 2020-12 | 2020-12 |
2019-09 | 2019-09 | 2019-09 |
2020-12 | 2019-09 | 2020-12 |
2019-09 | 2020-12 | 2019-09 |
指定なし | 指定なし | 最新バージョン(2020-12)※ |
指定なし | 2019-09 | 2019-09 |
※未指定の場合はデフォルトで最新バージョンが使用されるため、2022/07/10時点(JsonSchema.NET 3.1.4)ではJSON Schema 2020-12となります。
By default, the latest supported version will be used.
https://json-everything.net/json-schema/
検証に使用したソースです。これの中身を少々変えつつ実施しました。
using Json.Schema; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.Json; using System.Text.Json.Nodes; using System.Text.Json.Serialization; using System.Threading.Tasks; namespace jsonschema_validation { internal class JsonValidation { public static void Main(string[] args) { JsonSchema schema = new JsonSchemaBuilder() .Type(SchemaValueType.Array) .PrefixItems( new JsonSchemaBuilder() .Type(SchemaValueType.Integer), new JsonSchemaBuilder() .Type(SchemaValueType.Boolean) ) .Items(new JsonSchemaBuilder() .Type(SchemaValueType.String) ) .Schema("https://json-schema.org/draft/2020-12/schema"); //).Schema("https://json-schema.org/draft/2019-09/schema"); var instance = new JsonArray { 1, true, "foo", "bar" }; var options = new ValidationOptions { ValidateAs = Draft.Draft202012 //ValidateAs = Draft.Draft201909 }; var results = schema.Validate(instance, options); Console.WriteLine(results.IsValid); } } }
コメント