スキーマバージョンの指定方法
スキーマのバージョンを指定する方法は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);
}
}
}
コメント