通过Elm端口将对象转换为JSON解码器

时间:2016-12-20 20:58:12

标签: elm

我通过端口将一组对象传递到我的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代码中这样做。

1 个答案:

答案 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