Elm:
Робота з JSON
Як робити:
Elm ставиться до обробки JSON з явністю та безпечністю, в першу чергу використовуючи модулі Json.Decode
та Json.Encode
. Щоб почати працювати з JSON, спочатку вам потрібно визначити декодер для вашого типу даних. Припустимо, ми працюємо з простим об’єктом профілю користувача.
Спочатку визначте свій тип Elm:
type alias UserProfile =
{ id : Int
, name : String
, email : String
}
Декодування JSON в Elm
Щоб декодувати рядок JSON в тип UserProfile
, створіть декодер:
import Json.Decode exposing (Decoder, int, string, field, map3)
userProfileDecoder : Decoder UserProfile
userProfileDecoder =
map3 UserProfile
(field "id" int)
(field "name" string)
(field "email" string)
Для декодування об’єкта 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
{- Приклад виводу:
Result.Ok { id = 1, name = "John Doe", email = "[email protected]" }
-}
Кодування Elm у JSON
Щоб закодувати значення Elm назад у JSON, скористайтесь модулем 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
{-
Використання:
encodeUserProfile { id = 1, name = "John Doe", email = "[email protected]" }
Приклад виводу:
"{"id":1,"name":"John Doe","email":"[email protected]"}"
-}
Сторонні бібліотеки
Пакети Elm, як-от elm-json-decode-pipeline
, можуть спростити створення декодерів, використовуючи стиль конвеєра, що особливо зручно для декодування складних об’єктів.
Спочатку додайте бібліотеку до свого проекту:
elm install NoRedInk/elm-json-decode-pipeline
Потім ви можете спростити визначення декодера так:
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
{- Використовуйте цей декодер як і раніше з decodeString для декодування рядків JSON. -}
Цей підхід спрощує декодер, роблячи код чистішим та легшим для підтримки, особливо коли структури даних стають складнішими.