本ブログはアフィリエイト広告を利用しています。

JsonSchema.NETでバリデーションするスキーマバージョンの指定方法と優先度

スキーマバージョンの指定方法

スキーマのバージョンを指定する方法は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-122020-122020-12
2019-092019-092019-09
2020-122019-092020-12
2019-092020-122019-09
指定なし指定なし最新バージョン(2020-12)※
指定なし2019-092019-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);

        }
    }
}

参考

関連

コメント

タイトルとURLをコピーしました