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.

Reply via email to