2013-04-25 16 views
12

我有以下JSON輸出數據:您將如何爲任意鍵設計JSON模式?

{ 
    "label_name_0" : 0, 
    "label_name_5" : 3, 
    . 
    . 
    . 
    "label_name_XXX" : 4 
} 

的輸出是簡單的:用整數值相關聯的鍵[1]名稱。如果鍵名不改變,我可以很容易地拿出JSON模式與此類似:

{ 
     "type": "array" 
     "title": "Data output", 
     "items" :{ 
      "properties": { 
       "label_name": { 
        "type": "integer", 
        "default": 0, 
        "readonly": True, 
      } 
     } 
    }, 

由於密鑰名稱本身是不知道,並不斷變化,我要設計架構它。我唯一知道的是,關鍵是string,不超過100個字符。如何爲不斷變化的密鑰lable_name_xxx定義JSON模式。

[1]不知道如果我使用正確的術語

+1

您應該接受@Konrad的答案。 – jackr 2016-11-15 00:14:39

回答

20

在json-schema.org,你會發現在Advanced Examples部分合適的東西。您可以在object內定義patternProperties

{ 
    "type": "object", 
    "properties": { 
     "/": {} 
    }, 
    "patternProperties": { 
     "^(label_name_[0-9]+)+$": { "type": "integer" } 
    }, 
    "additionalProperties": false, 
} 

正則表達式(label_name_[0-9]+)+應該符合您的需求。在JSON模式中,正則表達式被明確地錨定爲^$。正則表達式定義,必須至少有一個屬性(+)。該物業包括label_name_09之間的數字,而必須有至少一個數字([0-9]+),但也可以是任意多數。

通過將additionalProperties設置爲false,它約束了對象屬性以匹配正則表達式。

6

正如康拉德的回答所述,使用patternProperties。但是使用properties來代替properties這是不需要的,我想Konrad剛剛從他的參考示例中粘貼了一個預期從/開始的路徑。在下面的示例中,模式匹配regex .*接受任何屬性名稱,並且只允許使用"additionalProperties": false來允許字符串類型或null。

"patternProperties": { 
    "^.*$": { 
     "anyOf": [ 
     {"type": "string"}, 
     {"type": "null"} 
     ] 
    } 
    }, 
    "additionalProperties": false