2016-05-10 5 views
9

Ich versuche, einen Zeitstempel (ex: "1493287973015") von einem JSON zu einem Datum-Typ zu konvertieren.Elm: Json Decoder Zeitstempel zu Datum

Bisher habe ich diese Gewohnheit Decoder:

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

Aber es funktioniert nicht, weil es ein Ergebnis hat zurückkehren, kein Datum:

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

    Time.Time -> Result String a 

But it is: 

    Time.Time -> Date.Date 

Gibt es eine Möglichkeit ein zu tun Umwandlung?

Antwort

16

Angenommen, Ihre JSON tatsächlich den numerischen Wert in Anführungszeichen setzen (dh Sie die JSON-Wert "1493287973015" und nicht 1493287973015 parsen), könnte der Decoder wie folgt aussehen:

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) 

Beachten Sie, dass stringToDate doesn‘ Es werden keine Parameter übergeben, im Gegensatz zu Ihrem Beispiel, in dem Sie versucht haben, einen Decoder String als Parameter zu übergeben. Das ist nicht so, wie Decoder funktionieren.

Stattdessen kann dies durch den Aufbau auf primitiveren Decodern erfolgen, in diesem Fall beginnen wir mit dem Decoder string from Json.Decode.

Der andThen Teil nimmt dann den String-Wert, der vom Decoder angegeben wird, und versucht, es zu einem Float zu analysieren. Wenn es eine gültige Float ist, wird es in eingegeben, andernfalls ist es ein Fehler.

Die Funktionen fail und succeed schließen die normalen Werte, mit denen Sie zu tun haben, in die Kontexte Decoder Date.Date ein, damit sie zurückgegeben werden können.

+1

Danke! Ich habe es funktioniert. JSON mit Elm zu dekodieren ist nicht gerade einfach. –

+3

Ich würde nicht weit gehen, um zu sagen, dass es nicht _easy_ ist. Es ist nur ungewohnt, wenn Sie aus einem imperativen Hintergrund kommen. Diese Art des Parsens ist in funktionalen Sprachen ziemlich häufig; Es ist bekannt als Parser Combinators. –