Elm:
Lavorare con JSON

Come fare:

Elm tratta la gestione JSON con esplicitezza e sicurezza, utilizzando principalmente i moduli Json.Decode e Json.Encode. Per iniziare a lavorare con JSON, devi prima definire un decodificatore per il tuo tipo di dato. Supponiamo che ci stiamo occupando di un semplice oggetto profilo utente.

Innanzitutto, definisci il tuo tipo Elm:

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

Decodificare JSON in Elm

Per decodificare una stringa JSON nel tipo UserProfile, crea un decodificatore:

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

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

Per decodificare un oggetto 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

{- Output di esempio:
Result.Ok { id = 1, name = "John Doe", email = "[email protected]" }
-}

Codificare Elm in JSON

Per codificare un valore Elm di nuovo in JSON, sfrutta il modulo 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]" }

Output di esempio:
"{"id":1,"name":"John Doe","email":"[email protected]"}"
-}

Librerie di Terze Parti

Pacchetti Elm come elm-json-decode-pipeline possono semplificare la creazione di decodificatori usando uno stile pipeline, che è particolarmente utile per decodificare oggetti complessi.

Prima, aggiungi la libreria al tuo progetto:

elm install NoRedInk/elm-json-decode-pipeline

Poi, puoi semplificare la definizione del decodificatore come segue:

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

{- Usa questo decodificatore come prima con decodeString per decodificare stringhe JSON. -}

Questo approccio semplifica il decodificatore, rendendo il codice più pulito e più manutenibile, specialmente man mano che le strutture dati diventano più complesse.