Hi. I would like to share helper functions which may be useful when one does JSON decoding debugging.
β’ First helper function just logs decoded value to the console if the decoding was successful.
log : String -> Decode.Decoder a -> Decode.Decoder a
log message =
Decode.map (Debug.log message)
Usage
import Json.Decode as Decode
import Extra.Json.Decode as Decode
type Point =
Point Int Int
pointDecoder : Decode.Decoder Point
pointDecoder =
Decode.map2 Point
(Decode.log βX:β (Decode.field βxβ Decode.int)) β Will log βX: 1β
(Decode.field βyβ Decode.int)
|> Decode.log βPoint:β β Will log βPoint: Point 1 2β
point : Result Decode.Error Point
point =
Decode.decodeString jsonDecoder "{ \"x\": 1, \"y\": 2}"
β’ Second helper function logs the result of the decoding whether it was success or failure.
debug : String -> Decode.Decoder a -> Decode.Decoder a
debug message decoder =
Decode.value
|> Decode.andThen (debugHelper message decoder)
debugHelper : String -> Decode.Decoder a -> Decode.Value -> Decode.Decoder a
debugHelper message decoder value =
let
_ =
Debug.log message (Decode.decodeValue decoder value)
in
decoder
Usage
import Json.Decode as Decode
import Extra.Json.Decode as Decode
type Point =
Point Int Int
pointDecoder : Decode.Decoder Point
pointDecoder =
Decode.map2 Point
(Decode.debug βX:β (Decode.field βxβ Decode.int)) β Will log βX: Ok 1β
(Decode.field βyβ Decode.int)
|> Decode.debug βPoint:β β Will log βPoint: Ok (Point 1 2)β
point : Result Decode.Error Point
point =
Decode.decodeString jsonDecoder "{ \"x\": 1, \"y\": 2}"