Elm:
Trabajando con JSON

Cómo hacerlo:

Elm trata el manejo de JSON con explicitud y seguridad, utilizando principalmente los módulos Json.Decode y Json.Encode. Para empezar a trabajar con JSON, primero necesitas definir un decodificador para tu tipo de datos. Supongamos que estamos tratando con un objeto de perfil de usuario simple.

Primero, define tu tipo en Elm:

type alias UserProfile = 
    { id : Int
    , name : String
    , email : String
    }

Decodificando JSON a Elm

Para decodificar una cadena JSON al tipo UserProfile, crea un decodificador:

import Json.Decode exposing (Decoder, int, string, field, map3)

userProfileDecoder : Decoder UserProfile
userProfileDecoder =
    map3 UserProfile
        (field "id" int)
        (field "name" string)
        (field "email" string)

Para decodificar un objeto JSON:

import Json.Decode exposing (decodeString)

jsonString : String
jsonString = 
    """{"id": 1, "name": "John Doe", "email": "john@example.com"}"""

decoded : Result String UserProfile
decoded =
    decodeString userProfileDecoder jsonString

{- Ejemplo de Salida:
Result.Ok { id = 1, name = "John Doe", email = "[email protected]" }
-}

Codificando Elm a JSON

Para codificar un valor Elm de vuelta a JSON, utiliza el módulo Json.Encode.

import Json.Encode exposing (object, int, string)

encodeUserProfile : UserProfile -> String
encodeUserProfile userProfile =
    object
        [ ("id", int userProfile.id)
        , ("name", string userProfile.name)
        , ("email", string userProfile.email)
        ]
        |> Json.Encode.encode 0

{-
Uso:
encodeUserProfile { id = 1, name = "John Doe", email = "[email protected]" }

Ejemplo de Salida:
"{"id":1,"name":"John Doe","email":"[email protected]"}"
-}

Bibliotecas de Terceros

Paquetes de Elm como elm-json-decode-pipeline pueden simplificar la creación de decodificadores utilizando un estilo de pipeline, lo cual es especialmente útil para decodificar objetos complejos.

Primero, agrega la biblioteca a tu proyecto:

elm install NoRedInk/elm-json-decode-pipeline

Luego, puedes simplificar la definición del decodificador de la siguiente manera:

import Json.Decode exposing (int, string, succeed)
import Json.Decode.Pipeline exposing (required, decode)

userProfileDecoder : Decoder UserProfile
userProfileDecoder =
    decode UserProfile
        |> required "id" int
        |> required "name" string
        |> required "email" string

{- Utiliza este decodificador como antes con decodeString para decodificar cadenas JSON. -}

Este enfoque simplifica el decodificador, haciendo que el código sea más limpio y mantenible, especialmente a medida que las estructuras de datos se vuelven más complejas.