Named
コンストラクタはパラメータとしてレコードを取得するため、名前と電子メールレコードのタイプエイリアスを作成するのに少し面倒かもしれません。
type alias NamedUserInfo =
{ name : String
, email : String
}
その後、エイリアスを使用するようにUser
を再定義することができます:
type User
= Anonymous
| Named NamedUserInfo
を上記厳密には必要ではないですが、私はレコードタイプをエイリアシングする道を多くの点で有用であることがわかっていることがわかります。それは私たちに、私たちは明らかにデコーダを定義することができますコンストラクタNamedUserInfo
を与えるので、ここではそれが便利です:
import Json.Decode exposing (..)
namedUserInfoDecoder : Decoder NamedUserInfo
namedUserInfoDecoder =
object2
NamedUserInfo
("name" := string)
("email" := string)
そして最後に、ユーザーのデコーダは、このように構成することができます
userDecoder : Decoder User
userDecoder =
oneOf
[ null Anonymous
, object1 Named namedUserInfoDecoder
]
あなたはあなたの例を実行することができますこのような簡単なテストを通じて:
exampleJson =
"""
[{"user":null}, {"user": {"name": "John Doe", "email": "[email protected]"}}]
"""
main =
text <| toString <| decodeString (list ("user" := userDecoder)) exampleJson
-- Ouputs:
-- Ok ([Anonymous,Named { name = "John Doe", email = "[email protected]" }])
は匿名と名前付きユーザーの両方を表現するあなたのJSONの例を提供することができますか? –
'[{" user ":null}、{" user ":{" name ":" John Doe "、" email ":" [email protected] "}}]' – ztsu