[解決済み] 1つのフィールドまたは別のフィールド、あるいは(他の2つのフィールドのうちの1つ)を要求し、それらのすべてを要求しないようにするにはどうすればよいですか?
2023-06-26 22:06:14
質問
JSONのスキーマで、JSONに以下のいずれかが含まれているかどうかを検証するのに苦労しています。
- 1 つのフィールドのみ
- 別のフィールドのみ
- (他の2つのフィールドのうちの1つ)のみ
のみで、複数存在する場合はマッチしません。
私の場合、具体的には
-
copyAll
-
fileNames
-
matchesFiles
またはdoesntMatchFiles
を検証したいが、それ以上のものがあるときは受け付けない。
今のところ、こんな感じです。
{
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"required": [ "unrelatedA" ],
"properties": {
"unrelatedA": {
"type": "string"
},
"fileNames": {
"type": "array"
},
"copyAll": {
"type": "boolean"
},
"matchesFiles": {
"type": "array"
},
"doesntMatchFiles": {
"type": "array"
}
},
"oneOf": [
{"required": ["copyAll"], "not":{"required":["matchesFiles"]}, "not":{"required":["doesntMatchFiles"]}, "not":{"required":["fileNames"]}},
{"required": ["fileNames"], "not":{"required":["matchesFiles"]}, "not":{"required":["doesntMatchFiles"]}, "not":{"required":["copyAll"]}},
{"anyOf": [
{"required": ["matchesFiles"], "not":{"required":["copyAll"]}, "not":{"required":["fileNames"]}},
{"required": ["doesntMatchFiles"], "not":{"required":["copyAll"]}, "not":{"required":["fileNames"]}}]}
]
} ;
これは私が望む以上にマッチします。私はこれが以下の全てにマッチすることを望んでいます。
{"copyAll": true, "unrelatedA":"xxx"}
{"fileNames": ["aab", "cab"], "unrelatedA":"xxx"}
{"matchesFiles": ["a*"], "unrelatedA":"xxx"}
{"doesntMatchFiles": ["a*"], "unrelatedA":"xxx"}
{"matchesFiles": ["a*"], "doesntMatchFiles": ["*b"], "unrelatedA":"xxx"}
が、一致しない。
{"copyAll": true, "matchesFiles":["a*"], "unrelatedA":"xxx"}
{"fileNames": ["a"], "matchesFiles":["a*"], "unrelatedA":"xxx"}
{"copyAll": true, "doesntMatchFiles": ["*b"], "matchesFiles":["a*"], "unrelatedA":"xxx"}
{"fileNames": ["a"], "matchesFiles":["a*"], "unrelatedA":"xxx"}
{"unrelatedA":"xxx"}
私が見逃している何か明白なものがあるのでしょう - それが何であるかを知りたいです。
どのように解決するのですか?
問題は "not" のセマンティクスです。 "not required" は "inclusion forbidden" を意味するものではありません。それは、そのスキーマを検証するためにそれを追加する必要がないことを意味するだけです。
しかし、より簡単な方法で仕様を満たすために "oneOf" を使用することができます。それは、"これらのスキーマのうち1つだけが検証可能である"という意味であることを覚えておいてください。以下のスキーマは、あなたが解決しようとしているプロパティの切り替えを実現するものです。
{
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"required": [
"unrelatedA"
],
"properties": {
"unrelatedA": {
"type": "string"
},
"fileNames": {
"type": "array"
},
"copyAll": {
"type": "boolean"
},
"matchesFiles": {
"type": "array"
},
"doesntMatchFiles": {
"type": "array"
}
},
"oneOf": [
{
"required": [
"copyAll"
]
},
{
"required": [
"fileNames"
]
},
{
"anyOf": [
{
"required": [
"matchesFiles"
]
},
{
"required": [
"doesntMatchFiles"
]
}
]
}
]
}
関連
-
[解決済み] Twitter API エラー 215
-
[解決済み] VBScriptによるJSONのデコード/エンコード
-
[解決済み] JSON標準 - 浮動小数点数
-
[解決済み] cURLでJSONデータをPOSTするにはどうすればよいですか?
-
[解決済み] RESTful WebServiceにファイルや関連データをJSONで投稿する。
-
[解決済み] JSONでnullを表現する
-
[解決済み] JSONオブジェクトをTypeScriptのクラスにキャストする方法を教えてください。
-
[解決済み] node.jsでJSONをpretty-printするにはどうしたらいいですか?
-
Gulpがデモ用ライティングウィジェットを作成
-
[解決済み] JSON Schemaで値を文字列やNULLに指定する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] ネストしたng-repeat
-
[解決済み] Unreadable Notebook NotJSONError('Notebook does not appear to be JSON: u'{'cells": [\'{'cell_type": "...],)
-
[解決済み] REST API - "Accept: application/json" HTTP ヘッダーを使用する
-
[解決済み] JSON標準 - 浮動小数点数
-
[解決済み] cURLでJSONデータをPOSTするにはどうすればよいですか?
-
[解決済み] jqを使用して、オブジェクト内の変数の値に基づいてオブジェクトを選択します。
-
json.loadsがエラーを報告します。二重引用符で囲まれたプロパティ名を期待:行1列2(char 1)
-
[解決済み] Swift Codableからプロパティを除外する方法は?
-
[解決済み] fs.writeFileSyncによるJSONオブジェクトのJSONファイルへの書き込み
-
[解決済み] PostgresでJSONフィールドにインデックスを作成するには?