web-dev-qa-db-ja.com

JSONスキーマの日時が正しくチェックされません

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」に変更しても、スキーマはそれが日時ではなくなったことに気付きません。

スキーマ内の何かを見逃しましたか?

31
IHeartAndroid

Pythonの jsonschema ライブラリの場合、validateを呼び出すときにフォーマットチェッカーを指定します。

jsonschema.validate(data, schema, format_checker=jsonschema.FormatChecker())

日時形式を検証するには、 strict-rfc3339 パッケージをインストールする必要があります。

形式の検証 を参照してください。

31
Beau Barker

_"format"_による検証はオプションです。これは、スキーマ作成者が完全に新しい形式を作成できるため、すべての形式が検証されることを期待することは合理的ではないためです。

ライブラリshould(適切な場合)には、特定の形式のカスタムバリデータを登録する方法があります。たとえば、(JavaScriptの)_tv4_検証ライブラリには tv4.addFormat()メソッド があります。

_tv4.addFormat('date-time', function (data) {
    return isValidDate(data);
});
_

これを行うと、スキーマ内の_"format": "date-time"_が日付を正しく検証するはずです。

9
cloudfeet

使用しているJSONスキーマ検証の実装では、日付と時刻のコンポーネントの間にT区切り文字が必要である可能性が高いです。これは、 RFC3339 仕様と ISO8601 の基本です。どちらもTを省略するための規定がありますが、どちらもサポートするために必須のものではなく、合意によって実行できるものにします。 (図に進みます。)

また、RFC3339doesでは、タイムゾーンオフセットまたはUTCを示すZを含める必要があります。これにより、未知のタイムゾーンにある人間の表現ではなく、特定の瞬間にロックされます。どちらも要求していないので、検証に失敗している可能性があります。

JSON Schema spec から:

7.3.1.2。検証

文字列インスタンスは、RFC 3339、セクション5.6[RFC3339]で定義されている有効な日付表現である場合、この属性に対して有効です。

5

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;
}
2
IHeartAndroid