It looks like the value in the "date" field contains a JavaScript Date object. You won't be able to directly decode the JS Date object to a Date in Elm.
You've requested comments_json to come through the port as a Json.Encode.Value, which can (opaquely) contain any JS value (not just JSON primitives); however, only JSON primitives can be "decoded" from a Value to another Elm type. When you log the value to the console, it appears the way it does because Elm converts it to a string and wraps it in angle brackets <https://github.com/elm-lang/core/blob/5.1.1/src/Native/Utils.js#L429>. If you can convert the "date" field of your comment object to a number (using Date.prototype.getTime <https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getTime>) in JS before sending it through the port, then you'll be able to decode it as a Float in Elm and convert it to a Date with Date.fromTime <http://package.elm-lang.org/packages/elm-lang/core/5.1.1/Date#fromTime>. Hope this helps! Justin On Saturday, February 4, 2017 at 9:35:10 AM UTC-5, fxmy wang wrote: > > Thanks Justing. > > What really is confusing me is that when passed through ports, the date > field of JSON *appeared in the form of <Thu Jan 26 2017 11:43:57 GMT+0800 > (CST)>* while the rest of the fields is just old plain string. I’m > probably wrong but it almost seems that Elm is doing some extra work on ISO > date strings, silently parsing them into internal representations when > receiving from ports. > > For your convenience, some relevant code: > > type Msg = > ... > | CommentJson Json.Encode.Value > > port comments_json : ( Json.Encode.Value -> msg) -> Sub msg > > update : Msg -> Model -> ( Model, Cmd Msg) > update msg model = > case msg of > CommentJson value -> > let > _ = Debug.log "value" value > in > ... > > And in console I just got > > value: { 0 = { author = { type = "full", displayName = "fxmy", url = > "https://github.com/fxmy", picture = > "https://avatars.githubusercontent.com/u/3283415?v=3&s=73" }, content = > "another test", date = <Thu Jan 26 2017 11:43:57 GMT+0800 (CST)> } } > > Any ideas how to hunt this down? > > Cheers, > > 在 2017年1月30日星期一 UTC+8下午11:21:34,Justin Mimbs写道: > > If you already have a Date in JS that you need to get into Elm, then >> sending it as an ISO string will certainly work. But another, more direct >> way to pass a date representation through a port is to pass it as a number, >> using the getTime >> <https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getTime> >> method >> in JS. In Elm, you can decode it as a Float and then convert it to a Date >> with Date.fromTime >> <http://package.elm-lang.org/packages/elm-lang/core/5.1.1/Date#fromTime>. >> >> There isn't a *Json.Decode.date*, likely because JSON doesn't describe a >> standard way to encode dates. In Elm, the idea of Json encoding/decoding >> extends to all conversions between JS types and Elm types, which is nice in >> that it gives us a unifying concept, but it does leave out the ability to >> pass Date values to and from Elm, without first converting them to a >> JSON-representable type. >> >> Justin >> >> On Sunday, January 29, 2017 at 2:47:43 PM UTC-5, Mickey Vashchinsky wrote: >>> >>> Looks like you already have Date and not String. >>> >>> I am pretty new to Elm myself and I couldn't find a way to decodeValue of >>> Date, but, I think as a workaround, on JavaScript side before sending >>> the json through port, you could convert your Date fields to String >>> with: >>> >>> myJson.date = myJson.date.toISOString() >>> >>> Hope it helps. >>> >>> >>> On Sunday, January 29, 2017 at 4:55:51 PM UTC+2, fxmy wang wrote: >>>> >>>> Hi guys, >>>> So I was trying to decode a field named date inside JSON as String but >>>> without success. And the result is quite confusing. >>>> Could anyone shed some light on me? >>>> >>>> JSON: >>>> >>>> [{"author":{"type":"full","displayName":"fxmy","url":"https://github.com/fxmy","picture":"https://avatars.githubusercontent.com/u/3283415?v=3&s=73"},"content":"another >>>> test","date":"2017-01-26T03:43:57.190Z"}] >>>> >>>> Json.Encode.Value that comes through port ( via Debug.log) : >>>> >>>> value: { 0 = { author = { type = "full", displayName = "fxmy", url = >>>> "https://github.com/fxmy", picture = >>>> "https://avatars.githubusercontent.com/u/3283415?v=3&s=73" }, content = >>>> "another test", date = <Thu Jan 26 2017 11:43:57 GMT+0800 (CST)> } } >>>> >>>> When trying to decode date field as String I got this, >>>> Result after calling Json.Decode.decodeValue ( via Debug.log) : >>>> >>>> Err "Expecting a String at _[0].date but instead got: >>>> \"2017-01-26T03:43:57.190Z\"" >>>> >>>> What am I doing wrong? >>>> >>>> Cheers. >>>> >>>> >>> > -- You received this message because you are subscribed to the Google Groups "Elm Discuss" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
