我正在尝试使用 aeson 解析以下形式的 JSON
{"field":{"name":"..."}}
or
{"tag":{"name":"..."}}
or
{"line":{"number":"..."}}
构造以下数据类型
data Rule = Line Integer
| Field L.ByteString
| Tag L.ByteString
不幸的是,我面临两个尚未找到解决方案的问题,即:
如何解析嵌套的 JSON?看看实施情况(.:) https://github.com/mailrank/aeson/blob/master/Data/Aeson/Types.hs#L258-261,它使用查找来提取特定键的值。我对做这样的事情犹豫不决,因为它似乎过于依赖 aeson 如何实现事物的细节。我认为这是一个问题是错误的吗?
如何根据 JSON 中存在的键使用正确的数据构造函数?我对 的所有努力都毫无结果。
我会发布到目前为止我编写的代码,但我什至还没有达到我有任何值得发布的程度。
下面的怎么样?
{-# LANGUAGE OverloadedStrings #-}
import Control.Applicative
import Data.Aeson
import Data.Aeson.Types
import qualified Data.ByteString as B
import qualified Data.ByteString.Lazy as L
import qualified Data.Map as M
data Rule = Line Integer
| Field L.ByteString
| Tag L.ByteString
deriving Show
instance FromJSON Rule where
parseJSON j = do
o <- parseJSON j -- takes care of JSON type check
case M.toList (o :: Object) of
[("field", Object o')] -> Field <$> o' .: "name"
[("tag", Object o')] -> Tag <$> o' .: "name"
[("line", Object o')] -> Line <$> o' .: "number"
_ -> fail "Rule: unexpected format"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)