DEV Community

Keeping decoders simple

Jasper Woudenberg on December 06, 2018

It can take a bit of time to wrap your head around how JSON decoders work. Especially functions like Json.Decode.andThen take a bit of practice to ...
Collapse
 
digitalsatori profile image
Tony Gu • Edited

Great write up! Thank you very much for sharing your experience with us.

I cached two errors when trying your code in Ellie.

  1. The individualDecoder should be like this:
individualDecoder : Decoder Individual
individualDecoder =
    Decode.map4
        (\id species name owner -> Individual id species name owner)
        (Decode.field "id" Decode.int)
        (Decode.field "species" Decode.string)
        (Decode.field "name" Decode.string)
        (Decode.maybe <| Decode.field "owner" Decode.int)
  1. The addIfPet function should be like this:
addIfPet : Individual -> Dict Int (List Pet) -> Dict Int (List Pet)
addIfPet individual petsCaredFor =
    case pet individual of
        Nothing ->
            petsCaredFor

        Just newPet ->
            case individual.owner of
                Just ownerid ->
                    Dict.update ownerid (Just << addOrInit newPet) petsCaredFor

                _ ->
                    petsCaredFor

I made the change accordingly in my Ellie and print some debug info on screen to visualize the decoding and converting process

Collapse
 
jwoudenberg profile image
Jasper Woudenberg

Amazing, thank you! Would you be okay if I linked your Ellie instead of mine from the post? I'll attribute it to you of course!

Collapse
 
digitalsatori profile image
Tony Gu

Sure, That's totally fine. I'm glad it helped.

Collapse
 
jerzy profile image
Piotr Małecki-Jurek

Hi, the article is great, and explains so much.
Did you thought about replacing

Decode.map4
    (\id species name owner -> Individual id species name owner)
    ...

with

Decode.map4
    Individual
    ...

I think it would be nice to just stress that out. It clears the function a bit more.

Cheers :)

Collapse
 
jwoudenberg profile image
Jasper Woudenberg

Hey, thanks for reading! Yeah, your way is what I usually do in code I write. I was a bit on the fence about the style to use in this post, and ended up deciding for the lambda because I thought that might be more accessible, although that is entirely debatable :).