2016-12-20 3 views
2

Я передаю массив объектов через порты в мое приложение Elm. Примером одного из объектов в массиве:Объекты в декодере JSON через порты в Вяз

{ 
    FullName: 'Foo Bar', 
    Location: 'Here' 
} 

Как вы можете видеть ключи в объекте начинаются с заглавной буквы, так что мне нужно, чтобы расшифровать их в Эльм. В моем коде Вязов У меня есть 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

Что такое '' твоя машина' в вашем примере 'peopleDecoder'? –

+0

Это была опечатка, исправленная сейчас. – joshuahornby10

ответ

4

Json.Decode.decodeValue может декодировать Json.Decode.Value, но он возвращает Result String (List Person).

Если вы определили свой Msg, как это:

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)