我有解析json的代码:
(Aeson.Object jsonObj) -> case (HashMap.lookup "one" jsonObj, HashMap.lookup "two" jsonObj, , HashMap.lookup "three" jsonObj) of
(Just one, Just two, Just three) -> -- what's next?
_ -> error "All three keys don't exist
"
如何从"一个","两个"中检索实际值?和"三"?所有这三个都是Data.Aeson.Value,其数据类型定义如下,但我无法弄清楚下一步该做什么:
data Value Source
A JSON value represented as a Haskell value.
Constructors
Object !Object
Array !Array
String !Text
Number !Number
Bool !Bool
Null
答案 0 :(得分:0)
您可以在模式匹配中检查值是否为预期类型,如下所示:
case HashMap.lookup "one" jsonObj of
(Just (Aeson.String t)) -> -- do with string t what pleases you
_ -> error "key not present or not a string"
您可以将其调整为代码中的三元组,或者将其作为单独的函数保留,无论您认为合适。 但要注意,这种风格实际上意味着你没有使用Parser
monad Aeson提供的内容,这对于剖析任意JSON非常有用。假设在上面的例子中,你真正想要实现的是:
parseTriple :: ByteString -> Maybe (Text, Integer, Bool)
然后,使用parseEither
,这可以表达为
parseTriple bs = decode bs >>= parseMaybe $ \o -> do
one <- o .: "one"
two <- o .: "two"
three <- o .: "three"
return (one, two, three)
我认为这很好地表达了您使用JSON所做的事情,并且易于遵循和维护。另外,如果您不使用parseMaybe
但parseEither
,则您甚至可以免费获得一些有用的错误消息。