2015-06-19 55 views
5

對於以下JSON字符串:json模式中的屬性和patternProperties有什麼區別?

{ 
    "abc" : 123, 
    "def" : 345 
} 

以下模式認爲有效:

{ 
    "$schema": "http://json-schema.org/draft-03/schema#", 
    "title": "My Schema", 
    "description": "Blah", 
    "type": "object", 
    "patternProperties": { 
     ".+": { 
      "type": "number" 
     } 
    } 
} 

但是,改變的patternProperties到性能仍然認爲它有效。那麼,這兩個標籤的區別是什麼?

回答

0

對象的屬性(鍵值對)使用properties關鍵字定義。屬性的值是一個對象,其中每個鍵都是屬性的名稱,每個值都是用於驗證該屬性的JSON模式。

additionalProperties可以限制對象,使其沒有未明確列出的附加屬性,或者可以爲對象上的任何其他屬性指定模式。有時這還不夠,並且您可能想要限制額外屬性的名稱,或者您可能想說,給定特定類型的名稱時,該值應與特定模式匹配。這就是patternProperties的用處:它是一個從正則表達式映射到模式的新關鍵字。如果附加屬性與給定正則表達式匹配,則它還必須根據相應的模式進行驗證。

注意:定義正則表達式時,請注意表達式可能與屬性名稱中的任何位置匹配。例如,正則表達式「p」將匹配其中的任何屬性名稱,例如「apple」,而不僅僅是名稱只是「p」的屬性。因此,在^ ... $中包含正則表達式通常不會令人困惑,例如,「^ p $」。

進一步參考 - http://spacetelescope.github.io/understanding-json-schema/reference/object.html

+0

第一款直接違揹我已經給出了例子:當我改變patternProperties關鍵字屬性,而無需改變模式的其餘部分,它仍然有效,這意味着屬性關鍵字也在處理正則表達式。 –

+0

可能是由於您的屬性關鍵字將您的正則表達式處理爲值類型僅爲數字的屬性,並且您提供了一個數字,說明爲什麼它接受了您的值。我不確定.. – Kandy

0

語義屬性:

  • 如果你聲明與包含在性能的一個關鍵的屬性,它必須滿足在性能聲明的架構。

語義patternProperties的:

  • 如果要聲明屬性和關鍵滿足patternProperties定義的正則表達式,它必須滿足patternProperties聲明的架構。

the docs,屬性優先級高於patternProperties更高,這意味着架構對patternProperties驗證只有當還沒有在性能符合。

5

對於以上所有屬性的模式應該是數字。此數據無效:

{ a: 'a' } 

如果用屬性替換patternProperties屬性'。+'應該是數字。所有其他屬性可以是任何東西。這將是無效的:

{ '.+': 'a' } 

這將是有效的:

{ a: 'a' } 
+0

當你說所有其他屬性可以是任何東西時,你是什麼意思?這是否意味着其他任何屬性都不會被驗證?我如何限制? –

+0

在'patternProperties'的情況下,所有與鍵中的模式匹配的屬性將被驗證。如果你使用'屬性',只有屬性等於密鑰纔會被驗證。所以如果你想驗證匹配模式的屬性,你應該使用'patternProperties'。如果你想驗證所有的屬性對同一個模式,最好使用'additionalProperties'。你的模式可以是''「type」:「object」,「additionalProperties」:{「type」:「number」}}'' - 它需要所有屬性都是數字。對這種情況使用patternProperties效率不高。 – esp

+0

好吧,所以屬性只有在具有完全相同的匹配關鍵字時纔會驗證字段。 patternProperties將匹配所有屬於該模式的鍵。 additionalProperties驗證文件中尚未被屬性或patternProperties所控制的所有其他屬性。我的理解是否正確? 2個問題在這裏 1.爲什麼patternProperties在這種情況下效率低下? 2.沒有一種方法來指定我的文件將只包含此屬性?如果文件包含此處未提及的任何其他屬性,則失敗? –

相關問題