2013-10-17 31 views
11

Tôi không thể nhận được aeson để phân tích giá trị UTCTime. Tôi cố gắng để mã hóa một và ăn nó trở lại, nhưng điều đó không làm việc:phân tích cú pháp utctime với aeson

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 

Các FromJSON thể hiện của loại UTCTime là như sau (ref):

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" 

sau mô tả định dạng tìm thấy here, mọi thứ sẽ ổn. Tôi đang thiếu gì?

Trả lời

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

Lưu ý là "cạm bẫy" trong haddocks:

Lưu ý rằng các tiêu chuẩn JSON đòi hỏi rằng giá trị cấp cao nhất được hoặc một mảng hoặc một đối tượng. Nếu bạn cố gắng sử dụng giải mã với một kết quả kiểu đó không được thể hiện trong JSON như một mảng hoặc đối tượng, mã của bạn sẽ typecheck, nhưng nó sẽ luôn luôn "thất bại" trong thời gian chạy:

...

Vì vậy, dính vào các đối tượng (ví dụ như bản đồ trong Haskell) hoặc mảng (danh sách hoặc vectơ trong Haskell):

+0

tôi đã đọc phần này. Tuy nhiên, bộ não của tôi không tạo ra kết nối. Cảm ơn! – Simon

+0

Một mẹo thực tế để thực hiện việc này là chỉ quấn các loại của bạn vào một lớp danh sách: 'decode" ... ":: FromJSON a => Có thể [a]'. Tôi sử dụng tất cả các thời gian để kiểm tra nhanh subparsers. Nó * dễ dàng hơn nhiều so với việc cố gắng viết lại các trình phân tích cú pháp Aeson bên trong để giúp bạn có hành vi JSON không chuẩn. –

+2

Nếu bạn sử dụng trình phân tích cú pháp 'giá trị' từ' Data.Aeson.Parser', bạn có thể ghi đè thông số. yêu cầu chỉ phân tích cú pháp đối tượng/mảng json mức cao nhất và phân tích các giá trị riêng lẻ. Sử dụng nó với attoparsec. –

Các vấn đề liên quan