从json中检索实际值

时间:2014-06-20 02:27:28

标签: json haskell

我有解析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

1 个答案:

答案 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所做的事情,并且易于遵循和维护。另外,如果您不使用parseMaybeparseEither,则您甚至可以免费获得一些有用的错误消息。