Skip to content

Instantly share code, notes, and snippets.

@AlainODea
Created May 20, 2016 18:21
Show Gist options
  • Save AlainODea/376d4b26ed7cae6080153c8c33c720c3 to your computer and use it in GitHub Desktop.
Save AlainODea/376d4b26ed7cae6080153c8c33c720c3 to your computer and use it in GitHub Desktop.
SSCCE of using Aeson to decode polymorphic JSON
#!/usr/bin/env stack
-- stack --install-ghc --resolver lts-5.13 runghc --package aeson
{-# LANGUAGE OverloadedStrings #-}
import Data.Aeson
import Data.Aeson.Types
import qualified Data.Text as T
main :: IO ()
main = do
let polyInt = decode "{\"polyField\":1234}" :: Maybe (Poly Int)
print polyInt
let polyConcrete = decode "{\"polyField\":{\"concreteField\":\"false\"}}" :: Maybe (Poly Concrete)
print polyConcrete
data Poly a = Poly
{ polyField :: a
} deriving Show
instance (FromJSON a) => FromJSON (Poly a) where
parseJSON (Object v) = Poly <$>
v .: "polyField"
parseJSON invalid = typeMismatch "Poly" invalid
data Concrete = Concrete
{ concreteField :: T.Text
} deriving Show
instance FromJSON Concrete where
parseJSON (Object v) = Concrete <$>
v .: "concreteField"
parseJSON invalid = typeMismatch "Concrete" invalid
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment