Elm:
使用JSON进行编程

如何操作:

Elm对JSON处理的态度是明确和安全的,主要使用Json.DecodeJson.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字符串时一样使用这个解码器。-}

这种方法简化了解码器,使代码更清晰、易于维护,特别是当数据结构变得更加复杂时。