2012-11-21 53 views
2

我正在使用NewtonSoft.JSON來執行一些JSON模式驗證。我看到如果JSON具有的附加數據超出了架構中指定的數據,那麼驗證返回「ISValid = true」。代碼和數據如下。該架構沒有名爲「城市」的屬性的屬性定義,即將到來的JSON數據具有該屬性和值。我期望下面的IsValid調用返回false,但它返回true。在架構上或者在諸如「Enforce strict」之類的類上是否存在一個設置,這些設置將強制數據僅包含模式中指定的數據?JSON.Net模式驗證不標記其他屬性?

public static void ValidateJsonSchema(string expectedSchema, string actualData) 
    { 
     JsonSchema validSchema = JsonSchema.Parse(expectedSchema); 
     JObject actualJson = JObject.Parse(actualData); 

     IList<string> messages; 
     if (!actualJson.IsValid(validSchema, out messages)) 
     { 
      throw new Exception("Returned data JSON schema validation failed." + messages.ToXml()); 
     } 
    } 
+0

你找到了這個問題的答案?我也想知道它。謝謝。 –

+0

你可以更新標籤嗎?你的問題不是依賴於語言,而只依賴於jsonschema規範。 –

回答

3

坐落在架構additionalProperties屬性設置爲false,所以當其他屬性都在你驗證數據驗證將失敗。

例如,如果您要驗證與街道名稱和門牌號,但不是城市中的地址,那麼它應該是這樣的:

{ 
    "title": "Address", 
    "type": "object" 
    "additionalProperties": false, 
    "properties": { 
    "streetName": { 
     "type": "string" 
    }, 
    "streetNum": { 
     "type": "integer" 
    } 
    } 
} 

以上將確保驗證將失敗,如果任何附加屬性出現在數據。但是,如果您缺少一個屬性(例如streetName),它仍然會通過驗證。爲了確保指定的所有屬性都在每個屬性目前使用required這樣的:

{ 
    "title": "Address", 
    "type": "object" 
    "additionalProperties": false, 
    "properties": { 
    "streetName": { 
     "type": "string", 
     "required": true 
    }, 
    "streetNum": { 
     "type": "integer", 
     "required": true 
    } 
    } 
} 

以上將確保兩者的數據中包含的每個屬性,只有那些屬性。

作爲支持者,我一直無法找到任何特定於JSON.Net和模式驗證的信息,但發現json模式site對於複雜的模式驗證非常有用。

0

您還可以設置AllowAdditionalProperties = falsevalidSchema對象

public static void ValidateJsonSchema(string expectedSchema, string actualData) 
{ 
    JsonSchema validSchema = JsonSchema.Parse(expectedSchema); 
    validSchema.AllowAdditionalProperties = false; 
    JObject actualJson = JObject.Parse(actualData); 

    IList<string> messages; 
    if (!actualJson.IsValid(validSchema, out messages)) 
    { 
     throw new Exception("Returned data JSON schema validation failed." + messages.ToXml()); 
    } 

}

相關問題