2016-05-10 18 views
9

Tôi đang cố gắng chuyển đổi dấu thời gian (ví dụ: "1493287973015") từ JSON thành loại Ngày.Elm: dấu thời gian bộ giải mã Json đến Ngày

Cho đến nay tôi đã tạo ra bộ giải mã tùy chỉnh này:

stringToDate : Decoder String -> Decoder Date 
stringToDate decoder = 
    customDecoder decoder Date.fromTime 

Nhưng nó không hoạt động bởi vì nó có trả về một kết quả, không phải là một ngày:

Function `customDecoder` is expecting the 2nd argument to be: 

    Time.Time -> Result String a 

But it is: 

    Time.Time -> Date.Date 

Có cách nào để làm một chuyển đổi?

Trả lời

16

Giả sử JSON của bạn là thực sự đặt giá trị số bên trong dấu ngoặc kép (có nghĩa là bạn đang phân tích các giá trị JSON "1493287973015" và không 1493287973015), bộ giải mã của bạn có thể trông như thế này:

import Json.Decode exposing (..) 
import Date 
import String 

stringToDate : Decoder Date.Date 
stringToDate = 
    string 
    |> andThen (\val -> 
     case String.toFloat val of 
      Err err -> fail err 
      Ok ms -> succeed <| Date.fromTime ms) 

ý rằng stringToDate doesn' t được thông qua bất kỳ tham số, như trái ngược với ví dụ của bạn, trong đó bạn đã cố gắng để vượt qua một Decoder String như một tham số. Đó không phải là cách giải mã hiệu quả. Thay vào đó, điều này có thể được thực hiện bằng cách xây dựng dựa trên bộ giải mã nguyên thủy hơn, trong trường hợp này, chúng ta bắt đầu với bộ giải mã string from Json.Decode.

Phần andThen sau đó lấy giá trị chuỗi do bộ giải mã đưa ra và cố gắng phân tích cú pháp đó thành phao. Nếu nó là Float hợp lệ, nó được đưa vào Date.fromTime, nếu không, đó là lỗi.

Các chức năng failsucceed bao bọc các giá trị thông thường bạn đang xử lý thành Decoder Date.Date ngữ cảnh để chúng có thể được trả lại.

+1

Cảm ơn! Tôi đã làm việc đó. Giải mã JSON với Elm không phải là chính xác dễ dàng. –

+3

Tôi sẽ không đi xa như để nói nó không phải là _easy_. Nó chỉ là không quen thuộc nếu bạn đã đến từ một nền tảng bắt buộc. Loại phân tích cú pháp này khá phổ biến trong các ngôn ngữ chức năng; nó được gọi là Parser Combinators. –

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