2017-02-24 46 views
2

我想使用JSON模式驗證某些值。我有兩個對象,稱之爲trackedItems和trackedItemGroups。 trackedItemGroups是一個組名和一個trackedItems名稱列表。例如,模式類似於:限制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"} 
     } 
    } 
    } 
} 

我想驗證在TrackedItemGroupsTrackedItems陣列的每個字符串是在TrackedItems.TrackedItemName已定義的名稱。

這會是這樣的使用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

And groups:

組別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"} 
] } 

既然你問「驗證以下一個語句,一個是真實的」,這也是一樣的簡單:

{"type": "string"} 

這並不是說您無法使用JSON Schema來聲明JSON中的數據之間的關係,但JSON Schema對於使用URI和超鏈接這樣做有點自opinion。

+0

謝謝,經過更多的研究,我發現模式不會與此工作。相反,我創建了一個單元測試來在代碼中執行此驗證。感謝您的回答。 – MichaelHouse