2016-03-07 86 views
0

這個JSON文件應該驗證失敗,但它沒有驗證。有人告訴我爲什麼。針對JSON模式的JSON驗證:爲什麼這個顯而易見的JSON數據沒有通過驗證

插件以下JSON數據和模式進入這個網站,驗證,
http://json-schema-validator.herokuapp.com 和我的騾子驗證JSON模式相同的結果。它顯然不符合模式(我添加了一些字段,我拼錯了一些字段,日期時間值不是真正的日期時間),但它並沒有使它失敗。有人能告訴我爲什麼嗎?

JSON模式:

{ 
    "$schema": "http://json-schema.org/draft-04/schema#", 
    "id": "http://hud.gov/ocio/xsd/esb/serviceauditingframework/2.0#", 
    "definitions": { 
    "serviceAuditLogData": { 
     "type": "object", 
     "title": "serviceAuditLogData", 
     "required": [ 
     "serviceRequestTimestamp", 
     "sourceSystem" 
     ], 
     "properties": { 
     "auditId": { 
      "type": "string" 
     }, 
     "serviceRequestTimestamp": { 
      "type": "string", 
      "format": "date-time" 
     }, 
     "serviceProvider": { 
      "type": "string" 
     }, 
     "serviceProviderVersion": { 
      "type": "string" 
     }, 
     "serviceProviderTimestamp": { 
      "type": "string", 
      "format": "date-time" 
     }, 
     "eventType": { 
      "type": "string" 
     }, 
     "eventDetail": { 
      "type": "string" 
     }, 
     "hostName": { 
      "type": "string" 
     }, 
     "sourceSystem": { 
      "type": "string" 
     }, 
     "authenticationId": { 
      "type": "string" 
     }, 
     "endUserId": { 
      "type": "string" 
     }, 
     "inputData": { 
      "type": "string" 
     } 
     }, 
     "propertiesOrder": [ 
     "auditId", 
     "serviceRequestTimestamp", 
     "serviceProvider", 
     "serviceProviderVersion", 
     "serviceProviderTimestamp", 
     "eventType", 
     "eventDetail", 
     "hostName", 
     "sourceSystem", 
     "authenticationId", 
     "endUserId", 
     "inputData" 
     ] 
    } 
    } 
} 

JSON數據

{ 
     "serviceAuditLogData": { 
     "junk":"asdfasdf", 
     "serviceRequestTimestamp": "2004-09-29T12:58:31.470Z", 
     "serviceProvider": "FLQS", 
     "serviceProviderVersion": "v1.0.1", 
     "audit_id": "17f24136-2494-4bf8-9d3b-9baafaae0cc9", 
     "serviceProviderTimestamp": "2012-11-04T21:44:57.997Z", 
     "eventType": "Query Pool", 
     "eventDetail": "default pool", 
     "hostName": "esb-d-srv1.", 
     "sourceSystem": "LRS", 
     "authenticationId": "EsbLrsAccount", 
     "endUserId": "H574857", 
     "inputData": "L234234234, L32453462345, L23452346" 
     } 
    } 

回答

1

它不會失敗,因爲你的架構沒有任何強制約束。請注意,definitions不是jsonschema關鍵字,表示約束驗證。它通常用於放置在模式定義的其他部分重新使用的子模式。因此,首先,您應該更改definitions關鍵字properties

jsonschema另一個常見的誤解與properties關鍵字有關。讓我們來看看下面的例子:

{ 
    "type" : "object", 
    "properties" : { 
     "key1" : { 
      "type" : "string" 
     } 
    } 
} 

你必須把它讀作:json必須是一個對象,並且它包含一個鍵等於key1的情況下,其值必須是一個字符串。根據以下兩個JSON對象是有效的:

{ 
    "key2":12 
} 

和:

{ 
    "key1":"sdf" 
} 

最後,涉及到date-time格式,你必須檢查section 6 of RFC3339,以確保你有一個有效的日期時間。在任何情況下,jsonschema驗證器都不是強制實施格式。

+0

糾錯:'定義'_是一個模式關鍵字;然而,它的使用被明確提到作爲subschemas的佔位符來在當前模式中進行驗證。否則你的解釋是正確的。假設它不是一個限制驗證的關鍵字:) – fge

+0

已更正。謝謝 – jruizaranguren

0

謝謝@jruizaranguren我還了解到,我需要將 「additionalProperties」:false和「required」:確保在API中傳遞什麼是預期的。

以下是我如何解決我的問題。

{ 
    "$schema": "http://json-schema.org/draft-04/schema#", 
    "type": "object", 
    "definitions": { 
    "serviceAuditLogData": { 
     "type": "object", 
     "additionalProperties": false, 
     "required": [ 
     "auditCorrelationId", 
     "serviceRequestTimestamp", 
     "serviceProvider", 
     "serviceProviderVersion", 
     "serviceProviderTimestamp", 
     "eventType", 
     "hostName", 
     "sourceSystem", 
     "authenticationId" 
     ], 
     "properties": { 
     "auditCorrelationId": { 
      "type": "string" 
     }, 
     "serviceRequestTimestamp": { 
      "type": "string", 
      "format": "date-time" 
     }, 
     "serviceProvider": { 
      "type": "string" 
     }, 
     "serviceProviderVersion": { 
      "type": "string" 
     }, 
     "serviceProviderTimestamp": { 
      "type": "string", 
      "format": "date-time" 
     }, 
     "eventType": { 
      "type": "string" 
     }, 
     "eventDetail": { 
      "type": "string" 
     }, 
     "hostName": { 
      "type": "string" 
     }, 
     "sourceSystem": { 
      "type": "string" 
     }, 
     "authenticationId": { 
      "type": "string" 
     }, 
     "endUserId": { 
      "type": "string" 
     }, 
     "inputData": { 
      "type": "string" 
     } 
     } 
    } 
    }, 
    "additionalProperties": false, 
    "required": [ 
    "serviceAuditLogData" 
    ], 
    "properties": { 
    "serviceAuditLogData": { 
     "$ref": "#/definitions/serviceAuditLogData" 
    } 
    } 
}