Elm:
Trabalhando com JSON

Como Fazer:

Elm trata o manuseio de JSON com explicitação e segurança, utilizando principalmente os módulos Json.Decode e Json.Encode. Para começar a trabalhar com JSON, você primeiro precisa definir um decodificador para o seu tipo de dado. Vamos supor que estamos lidando com um objeto de perfil de usuário simples.

Primeiramente, defina seu tipo Elm:

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

Decodificando JSON para Elm

Para decodificar uma string JSON para o tipo UserProfile, crie um 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 um 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

{- Saída de Exemplo:
Result.Ok { id = 1, name = "John Doe", email = "[email protected]" }
-}

Codificando Elm para JSON

Para codificar um valor Elm de volta para JSON, utilize o 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]" }

Saída de Exemplo:
"{"id":1,"name":"John Doe","email":"[email protected]"}"
-}

Bibliotecas de Terceiros

Pacotes Elm como elm-json-decode-pipeline podem simplificar a criação de decodificadores usando um estilo de pipeline, o que é especialmente útil para decodificar objetos complexos.

Primeiro, adicione a biblioteca ao seu projeto:

elm install NoRedInk/elm-json-decode-pipeline

Então, você pode simplificar a definição do decodificador assim:

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

{- Use este decodificador como antes com decodeString para decodificar strings JSON. -}

Esta abordagem simplifica o decodificador, tornando o código mais limpo e mais fácil de manter, especialmente à medida que as estruturas de dados se tornam mais complexas.