2013-11-28 2 views
24

를 확인하지 않습니다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"로 변경하면 스키마에서 날짜 시간이 더 이상 없음을 알 수 없습니다.

스키마에서 아무것도 찾지 못했습니까?

+0

어떤 [소프트웨어 (http://json-schema.org/implementations.html을) 유효성 검사를 처리하는 데 사용하고 있습니까? 일부 소프트웨어는 버그가 있거나 모든 것을 구현하지 않기 때문에 사양 (초안 04)에서도 날짜/시간 형식을 구현해야한다고 말합니다. http://json-schema.org/latest/json-schema-validation.html#anchor106 –

+0

일부 패키지는 선택적으로 형식 유효성 검사를 구현합니다. nodejs 용 tv4를 사용하면 함수 호출을 통해 형식에 대한 유효성 검사를 추가 할 수 있습니다. 어쩌면 다른 라이브러리에 적어도이 기능이 있습니까? – EthernetCable

답변

2

this library을 사용하여 문제를 해결했습니다. "format"은 선택과

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; 
} 
+0

시간대 오프셋을 가져야한다는 것은 이상한 일입니다. – PlexQ

+0

또는 [moment] (https://momentjs.com/) –

7

확인 : 그것은 자바 스크립트 코드에서 필드의 내용을 확인합니다. 스키마 작성자가 새 형식을 완전히 작성할 수 있으므로 일부 형식은 유효하므로 모든 형식의 유효성을 검사해야합니다.

라이브러리 (괜찮은 경우)에는 특정 형식에 대한 사용자 정의 유효성 검사기를 등록하는 방법이 있습니다. 정확하게 날짜를 확인해야 스키마에서 다음 "format": "date-time", 이런 짓을하면

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

예를 들어, (자바 스크립트)를 tv4 검증 라이브러리는 tv4.addFormat() method있다.

+0

Hum .. [사양] (http://json-schema.org/latest/json-schema-validation.html#anchor106) 형식에 따라 ** 날짜 - 시간 형식 ** 구현은 ** 선택 사항이 아닙니다 **. 그들은 구현되어야합니다 .. tv4에 대해서는 아마도 [감독] (https://github.com/geraintluff/tv4/search? q = 날짜 - 시간 & ref = cmdform)? –

+2

바로 링크 된 곳에서 먼저 "구현 ** **"형식 "키워드를 지원할 수 있습니다. 이렇게 선택해야합니까?". 따라서 "형식"을 지원할 수도 있습니다. 그렇다면 표준 집합을 지원해야합니다. – cloudfeet

+2

tv4는 기본적으로 "형식"값을 지원하지 않습니다. 그러나이 프로젝트는 표준 "형식"유효성 검사기 세트를 찾고 있으므로 원하는 경우 도움을받을 수 있습니다. :) – cloudfeet

4

사용중인 JSON 스키마 유효성 검사를 구현하려면 날짜 및 시간 구성 요소 사이에 T 구분 기호가 필요합니다. 이것은 RFC3339 사양의 기본이며 ISO8601을 기반으로합니다. 둘 다 T을 생략 할 수있는 조항이 있지만, 둘 다 계약을 통해 수행 할 수있는 것입니다. 지원해야하는 것은 아닙니다.

또한 RFC3339 에 UTC를 나타내려면 시간대 오프셋 또는 Z을 포함해야합니다. 이렇게하면 알 수없는 시간대에서 사람을 표현하는 것이 아니라 특정 순간을 잠급니다. 당신이 어느 쪽도 요구하지 않았기 때문에 그것은 검증에 실패한 것 같습니다. JSON Schema spec에서

: validate를 호출 할 때

7.3.1.2. Validation

A string instance is valid against this attribute if it is a valid date representation as defined by RFC 3339, section 5.6 [RFC3339].

22

파이썬의 jsonschema 모듈의 경우, 형식 검사를 지정

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

은 날짜 - 시간 형식을 검증하기 위해, strict-rfc3339 패키지가 설치되어야한다.

Validating Formats을 참조하십시오.

+1

감사! 필자는 파이썬 초보자이기 때문에 필자가 pip install strict-rfc3339를 구현할 수 있다는 것을 깨닫는 것보다 오래 걸렸다. 어쨌든, 매력처럼 작동합니다! –

-1

파이썬 jsonschema 모듈의 소스 코드를 변경할 수 있습니다.

jsonschema/_format.py func is_date_time(instance)에 datetime 관련 코드를 찾으십시오. 이와 같이, 버전 2.6의 경우 204 - 225 행.0 :

try: 
    import strict_rfc3339 
except ImportError: 
    try: 
     import isodate 
    except ImportError: 
     pass 
    else: 
     @_checks_drafts("date-time", raises=(ValueError, isodate.ISO8601Error)) 
     def is_datetime(instance): 
      if not isinstance(instance, str_types): 
       return True 
      return isodate.parse_datetime(instance) 
else: 
    @_checks_drafts("date-time") 
    def is_datetime(instance): 
     if not isinstance(instance, str_types): 
      return True 
     return strict_rfc3339.validate_rfc3339(instance) 

을 주석이 붙여, 또는 이것과 상기 기능 _check_drafts 교체 위 :

@_checks_drafts("date-time") 
def is_datetime(instance): 
    if not isinstance(instance, str_types): 
     return True 
    try: 
     datetime.datetime.strptime(instance, "%Y-%m-%d %H:%M:%S") 
    except ValueError: 
     return False 
    return True 
+0

pls는 어디에서 말해, 나는 그것을 찾아 낼 수 없다. 고마워요 ~~ –

+0

@ 코드 캐스터 아니요, 영어 번역본과 그 아래에 중국어 번역본이 있습니다. – ndbroadbent

+0

오케이, 알겠습니다! 감사합니다 ~~~ –