Легко декодируйте любой 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 и хотел бы помочь всем, кто застрял из-за отсутствия руководств или примеров. Не стесняйтесь писать мне.