必要に迫られて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");
}
}
}
}


コメント