スタックオーバーフロー| Google Group |ギターチャット| subreddit | YouTube |ドキュメント|寄付ガイド|
これは、JSONスキーマ検証のためのJSONスキーマコアドラフトV4、V6、V7、V2019-09およびV2020-12仕様のJava実装です。この実装は、メタスキーマ、語彙、キーワード、フォーマットのカスタマイズをサポートしています。
さらに、Openapi 3リクエスト/応答の検証は、適切なメタスキーマを使用することでサポートされています。スキーマに基づいてJSONノードから情報を収集したいユーザーのために、歩行者が役立ちます。使用されるJSONパーサーは、ジャクソンパーサーです。ライト4Jマイクロサービスフレームワークの重要なコンポーネントであるため、ライトレスト-4Jおよびライトハイブリッド4JのOpenAPI仕様に対するリクエスト/応答を検証して、実行時にパフォーマンスがデザインで最も重要な側面です。
既知の問題を含む各バージョンの互換性サポートに関する情報は、JSON Schemaバージョンドキュメントとの互換性に記載されています。
ドラフト2019-09以降、 format
キーワードはデフォルトでのみ注釈を生成し、アサーションを生成しません。
この動作は、 SchemaValidatorsConfig
またはExecutionConfig
でtrue
にsetFormatAssertionsEnabled
設定することにより、アサーションを生成するためにオーバーライドできます。
このライブラリには、コードの変更が必要になる可能性のあるminor
バージョンリリースの破損変更を含めることができます。
ライブラリをアップグレードする際の注目すべき情報または壊れた変更に関する情報は、新しいバージョンのドキュメントのアップグレードにあります。
[リリース]ページには、最新のバージョンに関する情報が含まれます。
CreekのJSONスキーマ検証比較プロジェクトには、さまざまなJava実装の機能特性とパフォーマンス特性の両方を比較するJVMベースのスキーマ検証実装の有益な比較があります。
Bowtieプロジェクトには、Java以外の実装を含むさまざまな実装の機能的特性を比較するが、パフォーマンスベンチマークは行われないレポートがあります。
これは、最も速いJava JSONスキーマバリデーターの実装である必要があります。
以下は、Java Microbenchmarkハーネスを使用するJSON Schema Validator Perftestプロジェクトのベンチマーク結果です。
ベンチマークの結果は、検証に使用される入力データワークロードとスキーマに大きく依存していることに注意してください。
この場合、このワークロードはドラフト4仕様を使用しており、 properties
キーワードの評価のパフォーマンスを大部分テストします。より典型的なワークロードのベンチマーク結果について、JVMベースのJSONスキーマ検証実装のパフォーマンス比較の結果を参照できます
パフォーマンスが重要な考慮事項である場合、特定のキーワードを使用すると異なるパフォーマンス特性があるため、特定のサンプルワークロードをベンチマークする必要があります。たとえば、 unevaluatedProperties
プロパリティまたはunevaluatedItems
キーワードの使用は、 properties
やitems
バリーターなどの関連する検証装置の注釈コレクションをトリガーし、注釈コレクションはパフォーマンスに悪影響を及ぼします。
Benchmark Mode Cnt Score Error Units
NetworkntBenchmark.testValidate thrpt 10 8352.126 ± 61.870 ops/s
NetworkntBenchmark.testValidate:gc.alloc.rate thrpt 10 721.296 ± 5.342 MB/sec
NetworkntBenchmark.testValidate:gc.alloc.rate.norm thrpt 10 90560.013 ± 0.001 B/op
NetworkntBenchmark.testValidate:gc.count thrpt 10 61.000 counts
NetworkntBenchmark.testValidate:gc.time thrpt 10 68.000 ms
Benchmark Mode Cnt Score Error Units
EveritBenchmark.testValidate thrpt 10 3775.453 ± 44.023 ops/s
EveritBenchmark.testValidate:gc.alloc.rate thrpt 10 1667.345 ± 19.437 MB/sec
EveritBenchmark.testValidate:gc.alloc.rate.norm thrpt 10 463104.030 ± 0.003 B/op
EveritBenchmark.testValidate:gc.count thrpt 10 140.000 counts
EveritBenchmark.testValidate:gc.time thrpt 10 158.000 ms
この実装は、JSONスキーマテストスイートに対してテストされています。テストはスイートに継続的に追加されるため、これらのテスト結果は最新ではない場合があります。
実装 | 全体 | draft_03 | draft_04 | draft_06 | draft_07 | drawt_2019_09 | draft_2020_12 |
---|---|---|---|---|---|---|---|
ネットワーク | パス:R:4803(100.0%)O:2372(100.0%) 失敗:R:0(0.0%)O:0(0.0%) | パス:R:610(100.0%)O:251(100.0%) 失敗:R:0(0.0%)O:0(0.0%) | パス:R:822(100.0%)O:318(100.0%) 失敗:R:0(0.0%)O:0(0.0%) | パス:R:906(100.0%)O:541(100.0%) 失敗:R:0(0.0%)O:0(0.0%) | パス:R:1220(100.0%)O:625(100.0%) 失敗:R:0(0.0%)O:0(0.0%) | パス:R:1245(100.0%)O:637(100.0%) 失敗:R:0(0.0%)O:0(0.0%) |
pattern
およびformat
regex
テストにJoniRegularExpressionFactory
を使用することに注意してください。 このライブラリは、他のプロジェクトで広く使用されているJava JSONパーサーであるJacksonを使用しています。プロジェクトで既にジャクソンパーサーを使用している場合、スキーマ検証のためにこのライブラリを他のライブラリよりも選択するのは自然です。
ライブラリは、スキーマ定義と入力データの両方でJSONとYAMLと連携します。
Openapi 3.0仕様は、JSONスキーマを使用してリクエスト/応答を検証していますが、いくつかの違いがあります。構成ファイルを使用すると、ライブラリがOpenAPI 3.0検証で動作できるようにすることができます。
ライトプラットフォームの設計原則に従って、このライブラリには、使用時に依存関係の競合がないことを確認するための最小限の依存関係があります。
以下は、このライブラリが含まれているときに自動的に含まれる依存関係です。
< dependency >
<!-- Used for logging -->
< groupId >org.slf4j</ groupId >
< artifactId >slf4j-api</ artifactId >
< version >${version.slf4j}</ version >
</ dependency >
< dependency >
<!-- Used to process JSON -->
< groupId >com.fasterxml.jackson.core</ groupId >
< artifactId >jackson-databind</ artifactId >
< version >${version.jackson}</ version >
</ dependency >
< dependency >
<!-- Used to process YAML -->
< groupId >com.fasterxml.jackson.dataformat</ groupId >
< artifactId >jackson-dataformat-yaml</ artifactId >
< version >${version.jackson}</ version >
</ dependency >
< dependency >
<!-- Used to validate RFC 3339 date and date-time -->
< groupId >com.ethlo.time</ groupId >
< artifactId >itu</ artifactId >
< version >${version.itu}</ version >
</ dependency >
以下は、特定のオプションに必要なオプションの依存関係です。
これらは自動的に含まれておらず、ライブラリを追加せずに関連するオプションを設定すると、 ClassNotFoundException
が表示されます。
< dependency >
<!-- Used to validate ECMA 262 regular expressions -->
<!-- Approximately 50 MB in dependencies -->
<!-- GraalJSRegularExpressionFactory -->
< groupId >org.graalvm.js</ groupId >
< artifactId >js</ artifactId >
< version >${version.graaljs}</ version >
</ dependency >
< dependency >
<!-- Used to validate ECMA 262 regular expressions -->
<!-- Approximately 2 MB in dependencies -->
<!-- JoniRegularExpressionFactory -->
< groupId >org.jruby.joni</ groupId >
< artifactId >joni</ artifactId >
< version >${version.joni}</ version >
</ dependency >
以下は、自動的に含まれる依存関係が必要ですが、必要でない場合は明示的に除外できます。
これが不要な場合は、YAML依存関係を除外できます。 YAMLであるスキーマまたは入力を処理しようとすると、 ClassNotFoundException
が発生します。
< dependency >
< groupId >com.networknt</ groupId >
< artifactId >json-schema-validator</ artifactId >
< exclusions >
< exclusion >
< groupId >com.fasterxml.jackson.dataformat</ groupId >
< artifactId >jackson-dataformat-yaml</ artifactId >
</ exclusion >
</ exclusions >
</ dependency >
date-time
形式の正確な検証が不要な場合、ETHLO時間依存性を除外できます。 date-time
形式では、 java.time.OffsetDateTime
を使用してdate-time
が有効かどうかを判断します。
< dependency >
< groupId >com.networknt</ groupId >
< artifactId >json-schema-validator</ artifactId >
< exclusions >
< exclusion >
< groupId >com.ethlo.time</ groupId >
< artifactId >itu</ artifactId >
</ exclusion >
</ exclusions >
</ dependency >
このライブラリは、多くの貢献者が非常に活発です。新機能とバグ修正は、チームメンバーによって迅速に処理されます。同じGithub組織におけるLight-4Jフレームワークの重要な依存関係であるため、フレームワークとともに進化および維持されます。
ライブラリはJava 8以上をサポートしています。ソースコードからビルドする場合は、JDK 8をローカルにインストールする必要があります。 JDKの複数のバージョンをサポートするには、SDKMANを使用できます
このパッケージは、Maven Centralで入手できます。
< dependency >
< groupId >com.networknt</ groupId >
< artifactId >json-schema-validator</ artifactId >
< version >1.5.3</ version >
</ dependency >
dependencies {
implementation ( group : 'com.networknt' , name : 'json-schema-validator' , version : '1.5.3' );
}
次の例は、スキーマに対して入力がどのように検証されるかを示しています。次の手順で構成されています。
schemaMappers
を使用して、 $id
検索URIにマッピングすることを構成します。schemaLoaders
を使用して検索URIを使用してスキーマのロード方法を構成します。たとえばMap<String, String> schemas
builder.schemaLoaders(schemaLoaders -> schemaLoaders.schemas(schemas))
構成することにより、Schema Dataへの検索uriのマッピングを含むString
。これは、 Function<String, String> schemaRetrievalFunction
も受け入れます。 // This creates a schema factory that will use Draft 2020-12 as the default if $schema is not specified
// in the schema data. If $schema is specified in the schema data then that schema dialect will be used
// instead and this version is ignored.
JsonSchemaFactory jsonSchemaFactory = JsonSchemaFactory . getInstance ( VersionFlag . V202012 , builder ->
// This creates a mapping from $id which starts with https://www.example.org/ to the retrieval URI classpath:schema/
builder . schemaMappers ( schemaMappers -> schemaMappers . mapPrefix ( "https://www.example.org/" , "classpath:schema/" ))
);
SchemaValidatorsConfig . Builder builder = SchemaValidatorsConfig . builder ();
// By default the JDK regular expression implementation which is not ECMA 262 compliant is used
// Note that setting this requires including optional dependencies
// builder.regularExpressionFactory(GraalJSRegularExpressionFactory.getInstance());
// builder.regularExpressionFactory(JoniRegularExpressionFactory.getInstance());
SchemaValidatorsConfig config = builder . build ();
// Due to the mapping the schema will be retrieved from the classpath at classpath:schema/example-main.json.
// If the schema data does not specify an $id the absolute IRI of the schema location will be used as the $id.
JsonSchema schema = jsonSchemaFactory . getSchema ( SchemaLocation . of ( "https://www.example.org/example-main.json" ), config );
String input = "{ r n "
+ " " main " : { r n "
+ " " common " : { r n "
+ " " field " : " invalidfield " r n "
+ " } r n "
+ " } r n "
+ "}" ;
Set < ValidationMessage > assertions = schema . validate ( input , InputFormat . JSON , executionContext -> {
// By default since Draft 2019-09 the format keyword only generates annotations and not assertions
executionContext . getExecutionConfig (). setFormatAssertionsEnabled ( true );
});
次の例は、スキーマがメタスキーマに対してどのように検証されるかを示しています。
これは、実際にはスキーマに対する入力の検証と同じです。この場合、入力がスキーマであり、使用するスキーマはメタスキーマです。
ドラフト4、ドラフト6、ドラフト7、ドラフト2019-09、ドラフト2020-12のメタスキーマはライブラリにバンドルされており、これらのクラスパスリソースはデフォルトで使用されることに注意してください。
JsonSchemaFactory jsonSchemaFactory = JsonSchemaFactory . getInstance ( VersionFlag . V202012 );
SchemaValidatorsConfig . Builder builder = SchemaValidatorsConfig . builder ();
// By default the JDK regular expression implementation which is not ECMA 262 compliant is used
// Note that setting this requires including optional dependencies
// builder.regularExpressionFactory(GraalJSRegularExpressionFactory.getInstance());
// builder.regularExpressionFactory(JoniRegularExpressionFactory.getInstance());
SchemaValidatorsConfig config = builder . build ();
// Due to the mapping the meta-schema will be retrieved from the classpath at classpath:draft/2020-12/schema.
JsonSchema schema = jsonSchemaFactory . getSchema ( SchemaLocation . of ( SchemaId . V202012 ), config );
String input = "{ r n "
+ " " type " : " object " , r n "
+ " " properties " : { r n "
+ " " key " : { r n "
+ " " title " : " My key " , r n "
+ " " type " : " invalidtype " r n "
+ " } r n "
+ " } r n "
+ "}" ;
Set < ValidationMessage > assertions = schema . validate ( input , InputFormat . JSON , executionContext -> {
// By default since Draft 2019-09 the format keyword only generates annotations and not assertions
executionContext . getExecutionConfig (). setFormatAssertionsEnabled ( true );
});
次のタイプの結果は、ライブラリによって生成されます。
タイプ | 説明 |
---|---|
アサーション | 特定の入力データインスタンスのキーワードによって生成される検証エラー。これは一般に、 ValidationMessage またはOutputUnit で説明されています。ドラフト2019-09以降、 format キーワードはデフォルトでアサーションを生成せず、代わりに構成オプションを使用して構成されていない場合、または適切な語彙を使用するメタスキーマを使用しない限り、注釈のみを生成することに注意してください。 |
注釈 | 特定の入力データインスタンスのキーワードによって生成された追加情報。これは通常、 OutputUnit で説明されています。注釈のコレクションとレポートはデフォルトでオフになります。 unevaluatedProperties やunevaluatedItems などのキーワードで必要な注釈は、常に評価のために収集され、無効にすることはできませんが、設定されていない限り報告されません。 |
次の情報は、両方のタイプの結果を説明するために使用されます。
タイプ | 説明 |
---|---|
評価パス | これは、評価が通過してインスタンスを評価するためのスキーマに到達するルートからのキーのセットです。これには、 $ref と$dynamicRef 含まれます。例えば。 /properties/bar/$ref/properties/bar-prop |
スキーマの場所 | これは、スキーマの標準的なIRIと、インスタンスの評価に使用されたスキーマのJSONポインターフラグメントです。例えば。 https://json-schema.org/schemas/example#/$defs/bar/properties/bar-prop |
インスタンスの場所 | これは、評価されていたインスタンスデータのJSONポインターフラグメントです。例えば。 /bar/bar-prop |
アサーションには、次の追加情報が含まれています
タイプ | 説明 |
---|---|
メッセージ | 検証エラーメッセージ。 |
コード | エラーコード。 |
メッセージキー | ローカリゼーションのメッセージを生成するために使用されるメッセージキー。 |
議論 | メッセージの生成に使用される引数。 |
タイプ | メッセージを生成したキーワード。 |
財産 | required キーワードの場合、検証エラーを引き起こしたプロパティ名。インスタンスノードを指すため、これはインスタンスの場所の一部ではないことに注意してください。 |
スキーマノード | JsonNode 、スキーマの場所を指しています。これは、入力データが失敗する原因となったスキーマデータです。 JsonSchemaFactory LocationJsonNodeFactoryFactory を使用し、 JsonNodes.tokenLocationOf(schemaNode) を使用するJsonNodeReader で構成することにより、位置情報を取得することができます。 |
インスタンスノード | JsonNode 、インスタンスの場所を指しています。これは、検証に失敗した入力データです。 LocationJsonNodeFactoryFactory を使用するJsonNodeReader でJsonSchemaFactory を構成し、 JsonNodes.tokenLocationOf(instanceNode) を使用することにより、位置情報を取得することができます。 |
エラー | エラー。 |
詳細 | カスタムキーワード有効化の実装で設定できる追加の詳細。これは図書館では使用されません。 |
注釈には、次の追加情報が含まれています
タイプ | 説明 |
---|---|
価値 | 生成された注釈値 |
ライブラリは、インスタンスノードとスキーマノードのために、 JsonNode
インスタンスにラインおよび列情報を保存するように構成できます。これはパフォーマンスに悪影響を及ぼし、デフォルトでは構成されていません。
これは、 JsonSchemaFactory
でLocationJsonNodeFactoryFactory
を使用するJsonNodeReader
構成することによって行われます。 JsonLocation
情報は、 JsonNodes.tokenLocationOf(jsonNode)
を使用して取得できます。
String schemaData = "{ r n "
+ " " $id " : " https://schema/myschema " , r n "
+ " " properties " : { r n "
+ " " startDate " : { r n "
+ " " format " : " date " , r n "
+ " " minLength " : 6 r n "
+ " } r n "
+ " } r n "
+ "}" ;
String inputData = "{ r n "
+ " " startDate " : " 1 " r n "
+ "}" ;
JsonSchemaFactory factory = JsonSchemaFactory . getInstance ( VersionFlag . V202012 ,
builder -> builder . jsonNodeReader ( JsonNodeReader . builder (). locationAware (). build ()));
SchemaValidatorsConfig config = SchemaValidatorsConfig . builder (). build ();
JsonSchema schema = factory . getSchema ( schemaData , InputFormat . JSON , config );
Set < ValidationMessage > messages = schema . validate ( inputData , InputFormat . JSON , executionContext -> {
executionContext . getExecutionConfig (). setFormatAssertionsEnabled ( true );
});
List < ValidationMessage > list = messages . stream (). collect ( Collectors . toList ());
ValidationMessage format = list . get ( 0 );
JsonLocation formatInstanceNodeTokenLocation = JsonNodes . tokenLocationOf ( format . getInstanceNode ());
JsonLocation formatSchemaNodeTokenLocation = JsonNodes . tokenLocationOf ( format . getSchemaNode ());
ValidationMessage minLength = list . get ( 1 );
JsonLocation minLengthInstanceNodeTokenLocation = JsonNodes . tokenLocationOf ( minLength . getInstanceNode ());
JsonLocation minLengthSchemaNodeTokenLocation = JsonNodes . tokenLocationOf ( minLength . getSchemaNode ());
assertEquals ( "format" , format . getType ());
assertEquals ( "date" , format . getSchemaNode (). asText ());
assertEquals ( 5 , formatSchemaNodeTokenLocation . getLineNr ());
assertEquals ( 17 , formatSchemaNodeTokenLocation . getColumnNr ());
assertEquals ( "1" , format . getInstanceNode (). asText ());
assertEquals ( 2 , formatInstanceNodeTokenLocation . getLineNr ());
assertEquals ( 16 , formatInstanceNodeTokenLocation . getColumnNr ());
assertEquals ( "minLength" , minLength . getType ());
assertEquals ( "6" , minLength . getSchemaNode (). asText ());
assertEquals ( 6 , minLengthSchemaNodeTokenLocation . getLineNr ());
assertEquals ( 20 , minLengthSchemaNodeTokenLocation . getColumnNr ());
assertEquals ( "1" , minLength . getInstanceNode (). asText ());
assertEquals ( 2 , minLengthInstanceNodeTokenLocation . getLineNr ());
assertEquals ( 16 , minLengthInstanceNodeTokenLocation . getColumnNr ());
assertEquals ( 16 , minLengthInstanceNodeTokenLocation . getColumnNr ());
このライブラリは、JSONスキーマの検証と注釈のための機械可読出力の仕様で定義されているフラグ、リスト、および階層出力形式を実装します。
リストと階層の出力形式は、システムが特定の結果にどのように到達したかを理解するために特に役立ちます。
出力形式 | 説明 |
---|---|
デフォルト | アサーションのリストを生成します。 |
ブール | 検証が成功した場合、 true を返します。この出力形式では、デフォルトでFail Fastオプションがオンになっていることに注意してください。 |
フラグ | 検証が成功した場合、 valid でtrue を有効にするOutputFlag オブジェクトを返します。この出力形式では、デフォルトでFail Fastオプションがオンになっていることに注意してください。 |
リスト | アサーションと注釈付きのOutputUnit オブジェクトのリストを含むdetails 備えたOutputUnit オブジェクトを返します。アノテーションはデフォルトで収集されず、パフォーマンスに影響を与えるため有効にする必要があることに注意してください。 |
階層 | アサーションと注釈を使用して、評価パスのOutputUnit の階層を持つOutputUnit を返します。アノテーションはデフォルトで収集されず、パフォーマンスに影響を与えるため有効にする必要があることに注意してください。 |
次の例は、注釈のコレクションとレポートがオンになってフォーマットのアサーションをオンにして、階層出力形式を生成する方法を示しています。
JsonSchemaFactory factory = JsonSchemaFactory . getInstance ( VersionFlag . V202012 );
SchemaValidatorsConfig config = SchemaValidatorsConfig (). builder (). formatAssertionsEnabled ( true ). build ();
JsonSchema schema = factory . getSchema ( SchemaLocation . of ( "https://json-schema.org/schemas/example" ), config );
OutputUnit outputUnit = schema . validate ( inputData , InputFormat . JSON , OutputFormat . HIERARCHICAL , executionContext -> {
executionContext . getExecutionConfig (). setAnnotationCollectionEnabled ( true );
executionContext . getExecutionConfig (). setAnnotationCollectionFilter ( keyword -> true );
});
以下は、階層形式からのサンプル出力です。
{
"valid" : false ,
"evaluationPath" : " " ,
"schemaLocation" : " https://json-schema.org/schemas/example# " ,
"instanceLocation" : " " ,
"droppedAnnotations" : {
"properties" : [ " foo " , " bar " ],
"title" : " root "
},
"details" : [ {
"valid" : false ,
"evaluationPath" : " /properties/foo/allOf/0 " ,
"schemaLocation" : " https://json-schema.org/schemas/example#/properties/foo/allOf/0 " ,
"instanceLocation" : " /foo " ,
"errors" : {
"required" : " required property 'unspecified-prop' not found "
}
}, {
"valid" : false ,
"evaluationPath" : " /properties/foo/allOf/1 " ,
"schemaLocation" : " https://json-schema.org/schemas/example#/properties/foo/allOf/1 " ,
"instanceLocation" : " /foo " ,
"droppedAnnotations" : {
"properties" : [ " foo-prop " ],
"title" : " foo-title " ,
"additionalProperties" : [ " foo-prop " , " other-prop " ]
},
"details" : [ {
"valid" : false ,
"evaluationPath" : " /properties/foo/allOf/1/properties/foo-prop " ,
"schemaLocation" : " https://json-schema.org/schemas/example#/properties/foo/allOf/1/properties/foo-prop " ,
"instanceLocation" : " /foo/foo-prop " ,
"errors" : {
"const" : " must be a constant value 1 "
},
"droppedAnnotations" : {
"title" : " foo-prop-title "
}
} ]
}, {
"valid" : false ,
"evaluationPath" : " /properties/bar/$ref " ,
"schemaLocation" : " https://json-schema.org/schemas/example#/$defs/bar " ,
"instanceLocation" : " /bar " ,
"droppedAnnotations" : {
"properties" : [ " bar-prop " ],
"title" : " bar-title "
},
"details" : [ {
"valid" : false ,
"evaluationPath" : " /properties/bar/$ref/properties/bar-prop " ,
"schemaLocation" : " https://json-schema.org/schemas/example#/$defs/bar/properties/bar-prop " ,
"instanceLocation" : " /bar/bar-prop " ,
"errors" : {
"minimum" : " must have a minimum value of 10 "
},
"droppedAnnotations" : {
"title" : " bar-prop-title "
}
} ]
} ]
}
名前 | 説明 | デフォルト値 |
---|---|---|
annotationCollectionEnabled | 処理中に注釈が収集されるかどうかを制御します。注釈を収集すると、パフォーマンスに悪影響を与えることに注意してください。 | false |
annotationCollectionFilter | 注釈を収集および報告するためのキーワードを制御するために使用される述語。これには、 annotationCollectionEnabled true である必要があります。 | keyword -> false |
locale | ValidationMessage でメッセージを生成するために使用するロケール。この値は、各実行に対してSchemaValidatorsConfig からコピーされていることに注意してください。 | Locale.getDefault() |
failFast | アサーションが生成されたときにすぐに失敗を返すかどうか。この値は、実行ごとにSchemaValidatorsConfig からコピーされているが、ブールおよびフラグ出力形式では自動的にtrue に設定されていることに注意してください。 | false |
formatAssertionsEnabled | デフォルトは、ドラフト4からドラフト7までのフォーマットアサーションを生成し、ドラフト2019-09からのみ注釈を生成することです。 true またはfalse に設定すると、デフォルトの動作がオーバーライドされます。 | null |
debugEnabled | 処理時にノード情報を記録するためにデバッグロギングが有効かどうかを制御します。これにより、パフォーマンスに影響する多くのログが生成されることに注意してください。 | false |
名前 | 説明 | デフォルト値 |
---|---|---|
applyDefaultsStrategy | 欠落しているときに歩くときまたはヌルノードに遭遇したときにデフォルトを適用するための戦略が発生します。 | ApplyDefaultsStrategy.EMPTY_APPLY_DEFAULTS_STRATEGY |
cacheRefs | REFからロードされたスキーマがキャッシュされ、その後の実行のために再利用されるかどうか。これをfalse に設定すると、パフォーマンスに影響しますが、 anyOf 、 oneOf 、 allOf の複数のネストされたアプリケーターが使用されている場合、キャッシュの高いメモリ使用量を防ぐためのネクタリーである可能性があります。 | true |
discriminatorKeywordEnabled | discriminator キーワードがOpenapi 3に従って処理されるかどうか。 | false |
errorMessageKeyword | スキーマのカスタムエラーメッセージに使用するキーワード。設定されていない場合、この機能は無効になります。これは通常、 errorMessage またはmessage に設定されます。 | null |
executionContextCustomizer | これを使用して、 JsonSchema によって生成されたExecutionContext 各検証実行にカスタマイズできます。 | null |
failFast | アサーションが生成されたときにすぐに失敗を返すかどうか。 | false |
formatAssertionsEnabled | デフォルトは、ドラフト4からドラフト7までのフォーマットアサーションを生成し、ドラフト2019-09からのみ注釈を生成することです。 true またはfalse に設定すると、デフォルトの動作がオーバーライドされます。 | null |
javaSemantics | Javaセマンティクスがtype キーワードに使用されるかどうか。 | false |
locale | ValidationMessage でメッセージを生成するために使用するロケール。 | Locale.getDefault() |
losslessNarrowing | type キーワードにロスレス絞り込みが使用されるかどうか。 | false |
messageSource | これは、ロケール固有のメッセージを取得するために使用されます。 | DefaultMessageSource.getInstance() |
nullableKeywordEnabled | nullable キーワードがOpenapi 3.0に従って処理されるかどうか。これは、 enum とtype キーワードに影響します。 | false |
pathType | インスタンスの場所と評価パスの報告に使用するパスタイプ。 JSONパスを使用するようにPathType.JSON_PATH に設定します。 | PathType.JSON_POINTER |
preloadJsonSchema | 入力を処理する前にスキーマがプリロードされるかどうか。これはメモリを使用しますが、検証の実行はより高速になります。 | true |
preloadJsonSchemaRefMaxNestingDepth | refをプリロードするときにプリロードするための評価パスの最大深度。 | 40 |
readOnly | スキーマが読み取られるかどうか。これは、 readOnly キーワードに影響します。 | null |
regularExpressionFactory | たとえばJoniRegularExpressionFactory またはGraalJSRegularExpressionFactory などの正規表現を作成するために使用する工場。これには、依存関係をプロジェクトに手動で追加する必要があります。また、 ClassNotFoundException がスローされます。 | JDKRegularExpressionFactory.getInstance() |
schemaIdValidator | これは$id 値の検証方法をカスタマイズするために使用されます。デフォルトの実装により、ベースIRIが指定されていない非空白のフラグメントが許可されており、ルートスキーマ内の非曖昧なIRI $id 値も許可することに注意してください。 | JsonSchemaIdValidator.DEFAULT |
strict | これは、キーワードが検証に厳格であるかどうかに設定されます。これが行うことは、個々のバリデーターに依存します。 | |
typeLoose | タイプがゆるい方法で解釈されるかどうか。 trueに設定すると、単一の値をサイズ1配列として解釈できます。文字列は、数、整数、またはブール波として解釈される場合があります。 | false |
writeOnly | スキーマが書き込みのみであるかどうか。これは、 writeOnly キーワードに影響します。 | null |
ライブラリがスキーマファクトリーからスキーマを作成すると、評価パスの各場所に明確なバリデーターインスタンスを作成します。これは、同じスキーマの場所を参照する異なる$ref
がある場合、評価パスごとに異なるバリデーターインスタンスが作成されることを意味します。
スキーマが作成されると、ライブラリはデフォルトで必要なすべてのバリデーターを自動的にプリロードし、参照を解決します。これは、 SchemaValidatorsConfig
のpreloadJsonSchema
オプションで無効にすることができます。この時点で、参照を解決できない場合、例外はスローされません。周期的な参照がある場合、最初のサイクルのみがプリロードされます。リモート参照をすべて解決できるようにしたい場合は、 JsonSchema
でinitializeValidators
メソッドを呼び出す必要があります。これは、解決できない参照がある場合に例外をスローする必要があります。
JsonSchemaFactory
のインスタンスとそこから作成されたJsonSchema
は、構成が変更されておらず、キャッシュされ再利用する必要がある場合、スレッドセーフになるように設計されています。 JsonSchema
再利用しないことは、作成されたValidatorインスタンスとリファレンスが解決されたバリデーターインスタンスでスキーマデータを繰り返す必要があることを意味します。参照が解決されると、作成されたバリデーターはキャッシュされます。深くネストされた参照を持つスキーマの場合、バリデーターに必要なメモリが非常に高い場合があります。その場合、 SchemaValidatorsConfig
のcacheRefs
オプションを使用してキャッシュを無効にする必要がある場合があります。これを無効にすると、参照からのバリエーターがパフォーマンスに影響を与える各検証実行ごとに再作成する必要があることを意味します。
注釈の収集は、検証パフォーマンスに悪影響を及ぼします。
以前のドラフト仕様には、パフォーマンスに影響を与える可能性のあるキーワードが少なくなります。たとえば、 unevaluatedProperties
またはunevaluatedItems
キーワードの使用は、 properties
やitems
検証装置などの関連する検証装置の注釈コレクションをトリガーします。
これは、後のドラフト仕様でスキーマを使用すると、パフォーマンスの影響が自動的に発生することを意味するものではありません。たとえば、 properties
Validatorはチェックを実行して、注釈を収集する必要があるかどうかを判断し、メタスキーマにunevaluatedProperties
キーワードが含まれているかどうか、および評価パスに隣接するunevaluatedProperties
キーワードが存在するかどうかをチェックします。
ライブラリは、ロードされているスキーマが信頼されていると想定しています。このセキュリティモデルは、スキーマがクラスパスのアプリケーションにバンドルされているユースケースを想定しています。
問題 | 説明 | 緩和 |
---|---|---|
スキーマの読み込み | ライブラリは、デフォルトでは、必要に応じてクラスパスおよびインターネット上のスキーマをロードします。 | DisallowSchemaLoader は、スキーマの取得を許可しないように構成できます。あるいは、許可されている検索虹彩を制限するようにAllowSchemaLoader を構成することができます。 |
スキーマキャッシング | デフォルトでライブラリは、スキーマをロードするときにリファレンスをデフォルトでリファレンスします。スキーマをプリロードするときは最大のネストの深さがありますが、サーバーから多くのメモリを消費するファンを備えたスキーマを構築することは依然として可能です。 | SchemaValidatorsConfig のcacheRefs オプションをfalseに設定します。 |
正規表現 | ライブラリは、特定の正規表現がサービス拒否(REDOS)に感受性があるかどうかを検証しません。 | AllowRegularExpressionFactory 、許可されている正規表現で検証を実行するように構成できます。 |
検証エラー | ライブラリはデフォルトですべての検証エラーを返しようとします。多数のスキーマを備えたallOf などのアプリケーターを使用すると、多くの検証エラーがメモリを引き起こす可能性があります。 | SchemaValidatorsConfig のfailFast オプションを設定して、最初のエラーが発生したときにすぐに戻ります。 OutputFormat.BOOLEAN またはOutputFormat.FLAG も使用できます。 |
Light-Rest-4J、Light-GraphQL-4J、Light-Hybrid-4Jは、このライブラリを使用して、仕様に基づいて要求と応答を検証します。 Spring Bootなどの他のフレームワークを使用している場合は、Openapi 3.0仕様に基づいた一般的なOpenapi 3.0バリデーターであるOpenApivalidatorを使用できます。
このライブラリを使用してプロジェクトがある場合は、PRを提出してプロジェクトを以下に追加してください。
このプロジェクトに貢献した次の人々に感謝します。このライブラリを使用している場合は、貢献者の1人のスポンサーになることを検討してください。
@stevehu
@Prashanth-Chaitanya
@fdutton
@valfirst
@balloonwen
@jiachen1120
@ddobrin
@eskabetxe
@ehrmann
@prashanthjos
@subhajitdas298
@fwiesner
@RHWOOD
@Jawaff
@nitin1891
すべての貢献者については、https://github.com/networknt/json-schema-validator/graphs/contributorsにアクセスしてください
貢献者の場合は、GitHubスポンサーに参加して、PRを介してスポンサーダッシュボードへのリンクを切り替えてください。