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-json-decode-pipelineのようなElmパッケージは、パイプラインスタイルを用いてデコーダの作成を簡単にすることができ、複雑なオブジェクトのデコードに特に便利です。

まず、ライブラリをプロジェクトに追加します:

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文字列をデコードするためにこのデコーダを使用します。-}

このアプローチはデコーダを単純化し、コードをよりクリーンで保守しやすくし、特にデータ構造が複雑になるにつれてその価値が増します。