我通过端口将一组对象传递到我的Elm应用程序中。数组中某个对象的示例是:
{
FullName: 'Foo Bar',
Location: 'Here'
}
正如您所看到的,对象中的键以大写字母开头,因此我需要在Elm中解码这些键。在我的榆树代码中,我type
Person
type alias Person =
{ fullName : String
, location : String
}
和端口:
port getPeople : (List Json.Decode.Value -> msg) -> Sub msg
最后我有一个解码器(我正在使用Elm Decode Pipeline)将数据解析为Person
类型。
peopleDecoder : Decoder Person
peopleDecoder =
decode Person
|> required "FullName" string
|> required "Location" string
我的问题是如何将传入的端口数据映射到Person
类型?我知道我可以在JS中这样做,但我宁愿在我的Elm代码中这样做。
答案 0 :(得分:4)
Json.Decode.decodeValue
可以解码Json.Decode.Value
,但会返回Result String (List Person)
。
如果您定义了这样的消息:
type Msg
= GetPeople (Result String (List Person))
您可以这样设置订阅:
port getPeople : (Json.Decode.Value -> msg) -> Sub msg
subscriptions : Model -> Sub Msg
subscriptions model =
getPeople (GetPeople << decodeValue (list peopleDecoder))
(请注意,端口中的第一个参数已更改为Value
而不是List Value
)