Elm:
Praca z JSON
Jak to zrobić:
Elm traktuje obsługę JSON z wyraźnością i bezpieczeństwem, głównie za pomocą modułów Json.Decode
i Json.Encode
. Aby rozpocząć pracę z JSON, musisz najpierw zdefiniować dekoder dla swojego typu danych. Załóżmy, że mamy do czynienia z prostym obiektem profilu użytkownika.
Po pierwsze, zdefiniuj swój typ Elm:
type alias UserProfile =
{ id : Int
, name : String
, email : String
}
Dekodowanie JSON do Elm
Aby zdekodować łańcuch JSON do typu UserProfile
, utwórz 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)
Aby zdekodować obiekt 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
{- Przykładowe wyjście:
Result.Ok { id = 1, name = "John Doe", email = "[email protected]" }
-}
Kodowanie Elm do JSON
Aby zakodować wartość Elm z powrotem do JSON, skorzystaj z modułu 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
{-
Użycie:
encodeUserProfile { id = 1, name = "John Doe", email = "[email protected]" }
Przykładowe wyjście:
"{"id":1,"name":"John Doe","email":"[email protected]"}"
-}
Biblioteki stron trzecich
Pakiety Elm, takie jak elm-json-decode-pipeline
, mogą upraszczać tworzenie dekoderów, używając stylu pipeline, co jest szczególnie przydatne przy dekodowaniu złożonych obiektów.
Najpierw dodaj bibliotekę do swojego projektu:
elm install NoRedInk/elm-json-decode-pipeline
Następnie możesz uprościć definicję dekodera w następujący sposób:
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
{- Użyj tego dekodera jak wcześniej z decodeString do dekodowania łańcuchów JSON. -}
To podejście upraszcza dekoder, czyniąc kod czystszym i bardziej łatwym do utrzymania, szczególnie gdy struktury danych stają się bardziej złożone.