Легко декодируйте любой JSON в псевдоним типа Elm, тип объединения, конструкторы одноэлементного типа. И любая вложенная комбинация из них.
В Elm кодирование и декодирование JSON довольно просто, в отличие от того, что думают люди. Основная проблема — отсутствие хороших примеров. Я много боролся и нашел ответы почти на все свои опасения. Спасибо замечательному сообществу Elm.
Ниже приводится то, что я намерен осветить в этой серии.
- Декодирование объектов JSON в Elm Records (текущая статья)
- Расшифровать поля, которые могут отсутствовать в JSON
- Декодировать поля типа Возможно
- Декодировать простой тип Union
- Декодировать тип объединения одного конструктора
- Декодировать параметризованный UnionType
- Расшифруйте любую комбинацию вышеперечисленного
- Кодировать любую комбинацию выше
- Стратегии борьбы с изменением формы типов по мере роста нашего приложения
- Использование версий для обеспечения обратной совместимости
- Стратегии обработки ошибок декодирования
Декодирование объектов JSON в Elm Records
Мы можем отправлять объекты Javascript напрямую через порты. Нет необходимости кодировать их в JSON. После получения мы можем использовать Json.Decode.decodeValue
port onSomeEvent : (D.Value -> msg) -> Sub msg
Давайте определим псевдоним типа для SomeEvent
type alias SomeEvent = { name : String , age : Int }
Теперь давайте напишем для него декодер.
someEventDecoder = D.succeed SomeEvent |> DP.required "name" D.string |> DP.required "age" D.int
По соглашению я редко импортирую какой-либо модуль напрямую. Использование префикса пространства имен является предпочтительным. Так что же такое D и DP?
import Json.Encode as E import Json.Decode as D import Json.Decode.Pipeline as DP
Использование конвейерной библиотеки позволяет использовать функцию required
с оператором |>
.
Теперь, чтобы получить результат декодирования, мы можем просто написать
decodeSomeEvent: D.Value -> Result String SomeEvent decodeSomeEvent encoded = someEventDecoder |> D.decodeValue encoded
И мы закончили, ну почти. Теперь нам решать, как поступить в случае сбоя.
До скорого. Наслаждайтесь Эльмом!
P.S. При достаточной поддержке и поощрении я хотел бы написать инструмент, который полностью автоматизирует этот процесс.
Я люблю Elm и хотел бы помочь всем, кто застрял из-за отсутствия руководств или примеров. Не стесняйтесь писать мне.