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. -}

Цей підхід спрощує декодер, роблячи код чистішим та легшим для підтримки, особливо коли структури даних стають складнішими.