2013-10-17 2 views
11

UTCTime 값을 구문 분석하기 위해 aeson을 가져올 수 없습니다. 나는 하나를 인코딩하고 피드백을 시도하지만, 작동하지 않았다 :있는 형식 설명을 다음aeson을 사용하여 utctime을 구문 분석합니다.

instance FromJSON UTCTime where 
    parseJSON = withText "UTCTime" $ \t -> 
     case parseTime defaultTimeLocale "%FT%T%QZ" (unpack t) of 
      Just d -> pure d 
      _  -> fail "could not parse ISO-8601 date" 

:

Prelude Data.Aeson Data.Time.Clock> getCurrentTime >>= (print . encode) 
"\"2013-10-17T09:42:49.007Z\"" 
Prelude Data.Aeson Data.Time.Clock> decode "2013-10-17T09:42:49.007Z" :: Maybe UTCTime 
Nothing 
Prelude Data.Aeson Data.Time.Clock> decode "\"2013-10-17T09:42:49.007Z\"" :: Maybe UTCTime 
Nothing 

utcTime를 유형의 FromJSON 인스턴스는 다음 (ref)입니다 here, 모든 것이 정상입니다. 내가 뭘 놓치고 있니?

답변

17
Prelude Data.Aeson Data.Time> decode (encode [x]) :: Maybe [UTCTime] 
Just [2013-10-17 10:06:59.542 UTC] 

참고 haddocks에서 "함정"섹 JSON 표준 최상위 값 배열이나 객체가 될 것을 요구한다는

참고. 당신이 배열이나 객체로 JSON에 표시되지 않은 결과 유형, 코드와 디코드를 사용하려고하면 의 유형 체킹하지만 항상 런타임에 "실패"합니다 ...

그래서 (하스켈에서 목록 또는 벡터) 개체 (예 : 하스켈지도) 또는 배열을 스틱 :

+0

나는이 부분을 읽으했다. 그러나, 나의 두뇌는 연결을 만들지 않았다. 감사! – Simon

+0

이 문제를 해결하기위한 실용적인 트릭은 목록 레이어에서 유형을 그냥 감싸는 것입니다 :'decode "...":: FromJSON a => 아마도 [a]'. 나는 서브 파서를 빠르게 확인하기 위해이 모든 것을 사용한다. 비표준 JSON 동작을 얻기 위해 내부 Aeson 파서를 재배치하는 것보다 훨씬 쉽습니다. –

+2

'Data.Aeson.Parser'의'value' 파서를 사용하면 스펙을 오버라이드 할 수 있습니다. 최상위 json 객체/배열을 구문 분석하기위한 요구 사항 및 개별 값 구문 분석. attoparsec과 함께 사용하십시오. –