同意します。選択するobject
かstring
入力します。JSON スキーマのドキュメントを調べましたが、必要なほど明確に制約を表現するものは見つかりませんでした。したがって、そこにある 2 つのアプローチについての短い議論が頭に浮かびます。
タイプ文字列
JSON スキーマでは、オブジェクトを含む 7 つのプリミティブ型が定義されています。文字列は単純に JSON 文字列として定義されます。RFC 4627 では、JSON 文字列を次のように定義しています。
文字列は 0 個以上の Unicode 文字のシーケンスです
文字列の内容を制限する必要がありますが、これはあなたのケースに当てはまります。問題は、制限をどのように伝えるかです。a を使用しdescription
て別のサブスキーマを参照します。文字列に を定義し pattern
て、サブスキーマを正規表現としてエンコードすることもできます。ただし、これは非常にエラーが発生しやすく、人間が読めるものではありません。ただし、データのスキーマ検証を改善するために使用できます。
{
"title": "My Schema",
"type": "object",
"properties": {
"A": {
"type": "string".
"description": "Please refer to http://... for the subschema."
},
"B": {
"type": "string"
"description": "Please refer to http://... for the subschema."
}
}
これには利点があり、JSON プロバイダーがそのプロパティに文字列を配置する必要があることは間違いなく明らかです。欠点は、完全なスキーマを一度に見ることができず、説明が見落とされる可能性があり、ルックアップ プロセスも煩雑になることです。最後に、タイプを見ると非常に混乱しますstring
が、 aobject
はサブスキーマで定義されています。
型オブジェクト
型をそのまま使用するだけで、文字列を使用することのすべての欠点を回避できます。ここでの問題は、文字列エンコーディングでなければならないという説明が見落とされることです。
{
"title": "My Schema",
"type": "object",
"properties": {
"A": {
"description": "Must be encoded as string",
"type": "object",
"properties": { "A1": { "type": "string" }, "A2": { "type": "string" } }
},
"B": {
"description": "Must be encoded as string",
"type": "object"
"properties": { "A1": { "type": "string" }, "A2": { "type": "string" } }
}
}
string
タイプを使用して定義するなど、いつでも完全に偽物を作成できますがproperties
、これは無効な JSON スキーマになります。
Type Objectアプローチを使用することをお勧めします。この制約がありますが、文字列型を使用すると、その背後にあるデータが常に劣化します。制約は、他の方法で強制することができます。誰がデータを提供するかを監視し、すべての関係者に制約を伝え、この制約に関して有効でないデータをブロックします。
そして、おそらくこの制約は永久に存在しない可能性があり、それが変更された場合は、スキーマを再度変更する必要があり、それ以外の場合は、文字列エンコーディングの要件を示すコメントを削除するだけで済みます.