I'm having trouble converting a JSON encoded Radix tree into a Haskell data type[1]. I've tried numerous ways to get the FromJSON instances to handle all cases, but failing miserably. [1] unfortunately these type layouts are unchangeable as they are auto generated types from Thrift Here is a stripped down version of what I'm working with. For the JSON file, all keys are unknown at parse time. I only know that a key will be a string and it's value will be another JSON object or a JSON array of fixed length. Any help is appreciated. -- radix.hs -- {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE OverloadedStrings #-} import Control.Monad (mzero) import Data.Int import Data.Typeable import Data.Aeson import qualified Data.ByteString.Lazy as BL import Data.Text.Lazy as TL import qualified Data.Vector as V data Things = MkThings { thing :: TL.Text, times :: ThingTimes } deriving (Show, Eq, Typeable) data ThingTimes = MkThingtimes { ml :: V.Vector Times } deriving (Show, Eq, Typeable) data Times = MkTimes { t1 :: Maybe Int32, t2 :: Maybe Int32 } deriving (Show, Eq, Typeable) instance FromJSON (V.Vector Things) where parseJSON _ = return V.empty decodeRadix ::BL.ByteString -> Either String (V.Vector Things) decodeRadix = eitherDecode main :: IO () main = do j <- BL.readFile "radix.json" case decodeRadix j of Left err -> error err Right r -> print r -- radix.hs -- -- radix.json -- { "a" : { "b" : [ 1, 2 ], "c" : { "d" : [ 3, null ] } }, "a2" : { "b2" : [ 4, 5 ] } } -- radix.json --