0

領収書のスキーマを作成しており、特殊な領収書の種類 (ホテルの領収書の明細など) のさまざまな詳細オブジェクトを含むコア コンセプトのマスター スキーマを作成したいと考えています。現在の実装ではoneOf、JSON スキーマのメカニズムを活用しています。

{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "title": "Receipt",
    "type": "object",
    "properties": {
        ...
        "amount": { "type": "number" },
        "detail": {
            "type": "object",
            "oneOf": [
                { "$ref": "general-detail.schema.json" },
                { "$ref": "hotel-detail.schema.json" },
                ...
            ]
        }
    }
}

このアプローチの問題は、(tv4 を使用して) 検証すると、指定されたすべてのスキーマoneOfがチェックされているように見え、実際にはエラーが返されることです。この影響を最小限に抑えるには、detailプロパティを削除oneOfし、スキーマ レベル (たとえば の外部properties) に移動してから、各サブスキーマにルート プロパティ名を作成します。ただし、その場合でも、ホテルの領収書の種類を検証しているときにエラーが発生した場合は、「Missing required property: generalDetail」が表示されます。

だから2つの質問:

  • detail私が現在行っているような汎用プロパティを使用して、oneOf構造内の各サブスキーマをバリデーターに完全に検証させることはできますか (たとえば、oneOf間違って使用していますか)?
  • それが不可能な場合は、単に「型指定された」詳細プロパティのセット (「generalDetail」、「hotelDetail」など) を持つだけで十分ですが、それらがグループであることを指定する方法はありますか?検証対象のドキュメントには、そのうちの 1 つだけが存在する必要がありますか?

ティア

4

2 に答える 2

1
  1. 通常は anyOf を使用することをお勧めします - oneOf が必要な場合は非常にまれです。後者は常にすべてのスキーマを検証しますが、前者は最初にパスしたときに終了する可能性が高くなります。

  2. 他のいくつかのバリデータを見ることができます。tv4 は標準からの逸脱が多く、非常に遅いです。https://github.com/ebdrup/json-schema-benchmark

于 2015-06-21T00:04:04.593 に答える