module Json where import Data.Aeson import Data.Aeson.Types (parse) import Data.Text (Text, unpack) import Data.List (intercalate) import qualified Data.Vector as V import qualified Data.HashMap.Strict as H -- Get the JSON value of a key (|.) :: Object -> Text -> Value obj |. key = case parse (.: key) obj of Success val -> val Error err -> toJSON err -- Get the String value of a key (|:) :: Object -> Text -> String obj |: key = repr' (obj |. key) 0 -- Create a String representation of a JSON repr :: Value -> String repr obj = drop 1 $ repr' obj 0 -- Create a String representation of a JSON Value repr' :: Value -> Int -> String repr' val lev = case val of Array x -> intercalate ", " $ mapl (\i -> repr' i lev) x Object x -> concat $ map (dump x) $ H.keys x String x -> unpack x Number x -> show x Bool x -> show x Null -> "null" where indent = '\n' : (concat . replicate lev) " " dump o k = concat [indent, unpack k, ": ", repr' (o |. k) (lev+1)] mapl f v = V.toList $ V.map f v