如何使用 aeson 解析嵌套 JSON

2023-12-31

我正在尝试使用 aeson 解析以下形式的 JSON

{"field":{"name":"..."}}

or

{"tag":{"name":"..."}}

or

{"line":{"number":"..."}}

构造以下数据类型

data Rule = Line Integer
          | Field L.ByteString
          | Tag L.ByteString

不幸的是,我面临两个尚未找到解决方案的问题,即:

  1. 如何解析嵌套的 JSON?看看实施情况(.:) https://github.com/mailrank/aeson/blob/master/Data/Aeson/Types.hs#L258-261,它使用查找来提取特定键的值。我对做这样的事情犹豫不决,因为它似乎过于依赖 aeson 如何实现事物的细节。我认为这是一个问题是错误的吗?

  2. 如何根据 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(使用前将#替换为@)

如何使用 aeson 解析嵌套 JSON 的相关文章

随机推荐