2014-12-30 106 views
8

面臨模式驗證問題。Json模式動態密鑰驗證

模式:

{ 
    "type": "object", 
    "$schema": "http://json-schema.org/draft-03/schema", 
    "id": "#", 
    "required": true, 
    "patternProperties": { 
     "^[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,6}$": { 
      "type": "object", 
      "required": true, 
      "properties": { 
       "_from": { 
        "id": "_from", 
        "type": "string", 
        "required": true 
       }, 
       "message": { 
        "type": "object", 
        "id": "message", 
        "properties": { 
         "detail": { 
          "type": "string", 
          "id": "detail", 
          "required": true 
         }, 
         "from": { 
          "type": "string", 
          "id": "from", 
          "required": true 
         } 
        } 
       } 
      } 
     } 
    } 
} 

JSON:

{ 
    "[email protected]": { 
     "_from": "[email protected]", 
     "message": { 
      "from": "[email protected]", 
      "detail": "AnyonewanttomeetmeinParis" 
     } 
    }, 
    "[email protected]": { 
     "_from": "[email protected]", 
     "message": { 
      "from": "[email protected]", 
      "detail": "AnyonewanttomeetmeinParis" 
     } 
    } 
} 

這裏關鍵的電子郵件地址是動態的,不知何故,不確認電子郵件驗證正則表達式。

您能否請我建議更正架構。

我使用驗證:http://json-schema-validator.herokuapp.com/index.jsp

回答

7

我在你的模式看,你似乎已經忘記了逃跑一些字符或沒有正確地做到這一點:

"^[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,6}$" 

,並導致您將鼠標懸停在驗證程序頂部的鏈接上時可能會看到錯誤:

enter image description here

它應該是:

"^[A-Z0-9\\._%\\+-][email protected][A-Z0-9\\.-]+\\.[A-Z]{2,6}$" 

或沒有逃脫內/級人物,但我會用第一個模式,因爲我覺得它的意圖是清晰的:

"^[A-Z0-9._%+-][email protected][A-Z0-9.-]+\\.[A-Z]{2,6}$" 

你需要有兩個\,因爲第一個\是第二個\的轉義。與單一的它不會工作,因爲沒有escape sequence\.\+在JavaScript中。你想在模式本身有一個\

但是JSON模式patternProperties的情況下,在默認情況下,所以你需要通過添加a-z以它來擴展你的電子郵件模式中的敏感:

"^[A-Za-z0-9\\._%\\+-][email protected][A-Za-z0-9\\.-]+\\.[A-Za-z]{2,6}$" 

(我沒有發現任何其他辦法讓它不區分大小寫)

您還需要通過在patternProperties旁邊添加"additionalProperties": false來排除任何其他屬性名稱,否則它會捕獲與該模式不匹配的其他所有內容。

工作模式應該再是這樣的:

{ 
    "type": "object", 
    "$schema": "http://json-schema.org/draft-03/schema", 
    "id": "#", 
    "required": true,  
    "patternProperties": { 
     "^[A-Za-z0-9\\._%\\+-][email protected][A-Za-z0-9\\.-]+\\.[A-Za-z]{2,6}$": { 
      "type": "object", 
      "required": true, 
      "properties": { 
       "_from": { 
        "id": "_from", 
        "type": "string", 
        "required": true 
       }, 
       "message": { 
        "type": "object", 
        "id": "message", 
        "properties": { 
         "detail": { 
          "type": "string", 
          "id": "detail", 
          "required": true 
         }, 
         "from": { 
          "type": "string", 
          "id": "from", 
          "required": true 
         } 
        } 
       } 
      } 
     } 
    }, 
    "additionalProperties": false 
} 

我測試過它:http://jsonschemalint.com/

+0

試過你仍然改變失敗。改變之後,你嘗試驗證? –

+0

是的,我有。這可能是因爲你錯誤地格式化了片段,並且如果你從這裏複製他們缺少的右括號。 – t3chb0t

+0

驗證無效的電子郵件地址也是成功的。您是否嘗試給出無效的電子郵件地址。 –

4

改變了架構按照草案04:

{ 
"type": "object", 
"$schema": "http://json-schema.org/draft-04/schema", 
"patternProperties": { 
    "^[A-Za-z0-9\\._%\\+-][email protected][A-Za-z0-9\\.-]+\\.[A-Za-z]{2,6}$": { 
     "type": "object", 
     "properties": { 
      "__from": { 
       "type": "string" 
      }, 
      "message": { 
       "type": "object", 
       "properties": { 
        "from": { 
         "type": "string" 
        }, 
        "detail": { 
         "type": "string" 
        } 
       }, 
       "required": [ "from","detail"] 
      } 
     }, 
     "required": [ "__from","message"] 
    } 
}, 
"additionalProperties": false 
}