Elm:
Arbeider med JSON

Hvordan:

Elm behandler JSON-håndtering med tydelighet og sikkerhet, hovedsakelig ved å bruke modulene Json.Decode og Json.Encode. For å begynne å jobbe med JSON, må du først definere en dekoder for datatypen din. La oss anta at vi har med et enkelt brukerprofilobjekt å gjøre.

Definer først din Elm-type:

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

Dekoding av JSON til Elm

For å dekode en JSON-streng til UserProfile-typen, opprett en dekoder:

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

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

For å dekode et JSON-objekt:

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

{- Eksempel på utdata:
Result.Ok { id = 1, name = "John Doe", email = "[email protected]" }
-}

Koding av Elm til JSON

For å kode en Elm-verdi tilbake til JSON, bruk modulen 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

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

Eksempel på utdata:
"{"id":1,"name":"John Doe","email":"[email protected]"}"
-}

Tredjepartsbiblioteker

Elm-pakker som elm-json-decode-pipeline kan forenkle opprettelsen av dekodere ved å bruke en pipeline-stil, noe som er spesielt nyttig for dekoding av komplekse objekter.

Først, legg til biblioteket i prosjektet ditt:

elm install NoRedInk/elm-json-decode-pipeline

Deretter kan du forenkle definisjonen av dekoderen som følger:

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

{- Bruk denne dekoderen som før med decodeString for å dekode JSON-strenger. -}

Denne tilnærmingen forenkler dekoderen, noe som gjør koden renere og mer vedlikeholdbar, spesielt etter hvert som datastrukturene blir mer komplekse.