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

C#でJSONのスキーマチェック(JsonSchema.NET)

nuget-jsonschema.net プログラミング

必要に迫られてC#にてJSONのスキーマチェックを行ったのでメモしておきます。
使用するライブラリはJsonSchema.NET(https://json-everything.net/json-schema)です。
Newtonsoft.json.Schema(https://www.newtonsoft.com/jsonschema)にしようとしたのですが、ライセンス的にアウトだったため(AGPL 3.0、もしくは有料)採用ならずでした。
JsonSchema.NETはMITです。

環境

  • Windows 10 Pro
  • Visual Studio 2022 v17.2.2
  • JsonSchema.NET 3.1.4

JsonSchema.NETをインストール

ツール -> NuGet パッケージマネージャー -> ソリューションの NuGet パッケージの管理
参照タブで “jsonschema.net” と入力して検索してインストールします。

nuget-jsonschema.net

JsonSchema.NETを使用してValidate実行

まずは使用するJSONです。長々書くと大変なのでシンプルなものを使用します。

チェック対象のJSON

{
    "key1": "value1",
    "key2": 123
}

JSON Schema

{
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
        "key1": {
            "type": "string"
        },
        "key2": {
            "type": "integer"
        }
    },
    "required": ["key1"]
}

処理の流れはJSON Schema読み込み -> チェック対象のJSON読み込み -> バリデーション実行 です。
今回はJSON Schemaはファイルから読み込んでいますが、JsonSchemaBuilderを使えばコードのみで出来そうです。
詳細は 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.Threading.Tasks;

namespace jsonschema_validation
{
    internal class JsonValidation
    {
        public static void Main(string[] args)
        {
            // JSON Schema
            using var sr = new StreamReader(@"F:\schema.json", Encoding.UTF8);
            var jsonSchemaStr = sr.ReadToEnd();

            // どちらでもOK
            //var jsonSchema = JsonSchema.FromText(jsonSchemaStr);
            var jsonSchema = JsonSerializer.Deserialize<JsonSchema>(jsonSchemaStr);

            // チェック対象のJSONファイル
            using var sr2 = new StreamReader(@"F:\sample.json", Encoding.UTF8);
            var jsonStr = sr2.ReadToEnd();
            var jsonNode = JsonNode.Parse(jsonStr);

            // バリデーション実行
            var ret = jsonSchema.Validate(jsonNode);
            if (ret.IsValid)
            {
                // OK
                Console.WriteLine("バリデーションOK");
            }
            else
            {
                // NG
                Console.WriteLine("バリデーションNG");
            }
        }
    }
}

参考

関連記事

コメント

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