2017-02-24 7 views
2

JSONスキーマを使用していくつかの値を検証したいと思います。私は2つのオブジェクト、それらを呼び出すtrackedItemsとtrackedItemGroups。 trackedItemGroupsは、グループ名とtrackedItems名のリストです。私はTrackedItemGroupsさんTrackedItemsアレイ内のすべての文字列がTrackedItems.TrackedItemNameで定義されている名前であることを検証したいと思います他のJSONオブジェクトの名前にJSON値を制限する

"TrackedItems": { 
    "type": "array", 
    "items": { 
    "type": "object", 
    "properties": { 
     "TrackedItemName": { "type": "string" }, 
     "Properties": { ---- } 
    } 
    } 
}, 
"TrackedItemGroups": { 
    "type": "array", 
    "items": { 
    "type": "object", 
    "properties": { 
     "GroupName": { 
     "type": "string" 
     }, 
    "TrackedItems": { 
     "type": "array", 
     "items": {"type": "string"} 
     } 
    } 
    } 
} 

:たとえば、スキーマは似ています。

これはenumプロパティを使用して値を制限するようなものですが、enumリストはTrackedITems.TrackedItemNameの値に基づいて生成されます。

JSON独自のデータを検証に使用するには、どのようにスキーマを記述できますか?

TrackedItemsは、自分が属するグループを定義していますが、何百ものアイテムが追跡されています。この組織は、私のユースケースの方がはるかに優れています。

私はこの試みた:

"TrackedItems": { 
    "type": "array", 
    "items": { 
     "oneOf": [ 
      {"$ref":"#/properties/TrackedItems/items/properties/TrackedItemName"} 
     ] 
    } 
} 

をしかし、これはエラーになります。データの例

Newtonsoft.Json.Schema.JSchemaReaderException: Could not resolve schema reference '#/properties/TrackedItems/items/properties/TrackedItemName'.

、私はTrackedItemsを持っていた場合:

アイテム1、アイテム2、 ItemA、ItemB、ItemC

グループ:

グループ1: アイテム1、ItemB、ItemC

グループ2: アイテム1、アイテム2、ItemZ

それはTrackedItemsで定義されていない項目が含まれているため、グループ2は、違反をスローしていました。

答えて

1

検証(と些細なアサーションによって記載される特定の他のもの)のための語彙なので、JSONスキーマは、データの一貫性を検証する方法を提供していません。

検証は、「Xが文字列であることを確認する」のようなアサーションを意味します。

一貫性とは、「Xが既存のアクティブなユーザーのIDであることを確認する」などのことを意味します。

比較されるデータは別のデータベースにまとめられている可能性があり、これらのアサーションの種類は重要ではないため、JSONスキーマはアプリケーションやその他のテクノロジまでのデータの一貫性を確認します。一部の実装では、ドキュメント内比較のベンダー固有の拡張がありますが、標準化されていないため、ここで動作するものは認識していません。それは参照することにより、別のスキーマに置換するだけの方法だと


$ref参照が、ここでは動作しません。

{ "oneOf": [ 
    {"$ref":"#/properties/TrackedItems/items/properties/TrackedItemName"} 
] } 

が言うように、まったく同じものです:あなたは参照が仕事を得るために管理することができる場合、このスキーマ(とあなたがエラーを得た私はなぜわからないんだけど、これは実装固有の詳細である)

{ "oneOf": [ 
    {"type": "string"} 
] } 

あなたが「次の文1のいずれかに該当することを確認し、」求めているので、これは単に同じです:

{"type": "string"} 

これは、JSONスキーマを使用してJSONのデータ間の関係を宣言することはできませんが、JSONスキーマはURIやハイパーリンクを使用することについて多少意見があります。

+0

もっと多くの研究をしていただき、ありがとうございました。私はスキーマがこれで動作しないことに気付きました。代わりにコードでこの検証を実行する単体テストを作成しました。ご回答有難うございます。 – MichaelHouse

関連する問題