elmでJSONをEncode/Decode

意外と苦戦したのでメモ

Encode

Recordならobject、Stringならstringのように対応する関数が用意されているので、全部マッピングして最後にencode関数でStringに変換する

公式のサンプルで何となく雰囲気が分かると思う

person =
    object
      [ ("name", string "Tom")
      , ("age", int 42)
      ]

compact = encode 0 person
-- {"name":"Tom","age":42}

Decode

個人的にはDecodeの方が面倒だった

基本的にはEncodeと似たような感じになるんだけど、レコードを扱うときはmapとfield、それにtype aliasで定義した型が必要になる

type alias Point = { x : Float, y : Float }

point : Decoder Point
point =
  map2 Point
    (field "x" float)
    (field "y" float)

-- decodeString point """{ "x": 3, "y": 4 }""" == Ok { x = 3, y = 4 }