質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Q&A

1回答

1154閲覧

JSON Schema で複数の定義を参照する場合の記述の仕方

gosaro

総合スコア25

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

0グッド

0クリップ

投稿2023/02/09 03:26

実現したいこと

JSON Schema で複数の定義(いずれもオブジェクト)を参照し、いずれかの定義に含まれるプロパティは許可し、いずれにも含まれないプロパティは不許可にしたいです。

どのように記述すればよいでしょうか。

発生している問題・エラーメッセージ

下記のソースコードにおいて、

line-color は「型が正しくありません。 "string" が必要です。」
「プロパティ back-color は許可されていません。」

となってほしいですが、

3つとも「プロパティ ~ は許可されていません。」
line-color は「型が正しくありません。 "string" が必要です。」

となってしまいます。

該当のソースコード

JSONSchema

1{ 2 "type": "object", 3 "additionalProperties": false, 4 "allOf": [ 5 { 6 "$ref": "#/definitions/paintable" 7 }, 8 { 9 "$ref": "#/definitions/borderable" 10 } 11 ], 12 "definitions": { 13 "paintable": { 14 "type": "object", 15 "properties": { 16 "fill-color": { 17 "type": "string" 18 } 19 } 20 }, 21 "borderable": { 22 "type": "object", 23 "properties": { 24 "line-color": { 25 "type": "string" 26 } 27 } 28 } 29 } 30}

JSON

1{ 2 "fill-color": "red", 3 "line-color": 0, 4 "back-color": "yellow" 5}

試したこと

"additionalProperties": false,
の行を削除すると

line-color は「型が正しくありません。 "string" が必要です。」

となります。
「プロパティ back-color は許可されていません。」は検出されません。

補足情報(FW/ツールのバージョンなど)

VS Code 1.75.0

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

「additionalProperties」を使用することで、未定義のプロパティを不許可にすることができます。
「allOf」を使用することで、複数のスキーマ(この場合は「paintable」と「borderable」)を組み合わせて1つのスキーマを定義することができます。

このような場合、「additionalProperties」は「allOf」内で指定されているすべてのスキーマに適用されます。そのため、「additionalProperties」を使用する前提として「allOf」内のスキーマにも「additionalProperties」を使用するように指定する必要があります。

次のように修正することで期待する動作になるかと思います。

{ "type": "object", "allOf": [ { "$ref": "#/definitions/paintable", "additionalProperties": false }, { "$ref": "#/definitions/borderable", "additionalProperties": false } ], "definitions": { "paintable": { "type": "object", "properties": { "fill-color": { "type": "string" } } }, "borderable": { "type": "object", "properties": { "line-color": { "type": "string" } } } } }

投稿2023/02/09 03:40

somak

総合スコア24

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gosaro

2023/02/09 04:25

回答ありがとうございます。 提示していただいたコードでは残念ながら期待した動作にはなりませんでした。 >「additionalProperties」は「allOf」内で指定されているすべてのスキーマに適用されます。 だとすると、JSON Schema を使う限り期待した結果を得るのは無理そうですね…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問