JSONとJSONスキーマがあります
JSON:
{
"aaa": "4000-02-01 00:00:00"
}
JSONスキーマ:
{
"$schema": "http://json-schema.org/draft-04/schema",
"type": "object",
"properties": {
"aaa": {
"type": "string",
"format": "date-time"
}
}, "required": ["aaa"]
}
JSONはJSONスキーマによって検証されます。ただし、フィールドaaa
を「bla」に変更しても、スキーマはそれが日時ではなくなったことに気付きません。
スキーマ内の何かを見逃しましたか?
Pythonの jsonschema ライブラリの場合、validate
を呼び出すときにフォーマットチェッカーを指定します。
jsonschema.validate(data, schema, format_checker=jsonschema.FormatChecker())
日時形式を検証するには、 strict-rfc3339 パッケージをインストールする必要があります。
形式の検証 を参照してください。
_"format"
_による検証はオプションです。これは、スキーマ作成者が完全に新しい形式を作成できるため、すべての形式が検証されることを期待することは合理的ではないためです。
ライブラリshould(適切な場合)には、特定の形式のカスタムバリデータを登録する方法があります。たとえば、(JavaScriptの)_tv4
_検証ライブラリには tv4.addFormat()
メソッド があります。
_tv4.addFormat('date-time', function (data) {
return isValidDate(data);
});
_
これを行うと、スキーマ内の_"format": "date-time"
_が日付を正しく検証するはずです。
使用しているJSONスキーマ検証の実装では、日付と時刻のコンポーネントの間にT
区切り文字が必要である可能性が高いです。これは、 RFC3339 仕様と ISO8601 の基本です。どちらもT
を省略するための規定がありますが、どちらもサポートするために必須のものではなく、合意によって実行できるものにします。 (図に進みます。)
また、RFC3339doesでは、タイムゾーンオフセットまたはUTCを示すZ
を含める必要があります。これにより、未知のタイムゾーンにある人間の表現ではなく、特定の瞬間にロックされます。どちらも要求していないので、検証に失敗している可能性があります。
JSON Schema spec から:
7.3.1.2。検証
文字列インスタンスは、RFC 3339、セクション5.6[RFC3339]で定義されている有効な日付表現である場合、この属性に対して有効です。
this library を使用して回避策を見つけました。 javascriptコードでフィールドのコンテンツをチェックします。
function isValidDate(datestring) {
var format = d3.time.format("%Y-%m-%d %H:%M:%S");
var date = format.parse(datestring);
if (date) {
return true;
}
return false;
}