Hacker News new | ask | show | jobs
by yamadapc 3568 days ago
In Haskell you can generate a parser to a typed structure using library combinators and code generation:

    data DataMessage = DataMessage { company :: Text
                                   }
      deriving (Show)
    $(deriveJSON defaultOptions ''DataMessage)

    data DataList = DataList { _data :: [DataMessage]
                             }
      deriving (Show)
    $(deriveJSON defaultOptions { fieldLabelModifier = drop 1 } ''DataList)

Which will fail properly when the data is malformed and in the real-world is even shorter, because you can set your data-type to protocol naming conventions and share them throughout.

Then there isn't much bloat. You wrote your types and generated your way to parse them.

You could test with:

    main = do
        print (encode (DataMessage "some-company"))
        print (decode "{\"company\":\"some-company\"}" :: Maybe DataMessage)

        print (encode (DataList [DataMessage "c1", DataMessage "c2", DataMessage "c3"]))
        print (decode "{\"data\":[{\"company\":\"c1\"},{\"company\":\"c2\"}]}" :: Maybe DataList)

https://gist.github.com/b30f6f09a737dcc980e052b0f3d2a39e
1 comments

You can also generate the types and parsers from a data sample.