必要に迫られて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” と入力して検索してインストールします。
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"); } } } }
コメント