对于这样的JSON:
[
[
"a",
"b",
[
"c"
]
]
]
如何在Haskell中解码它?
这是JSON中的递归数组:
data CValue = CList [CValue] | CString String
我已经阅读了使用JSON.text
和Aeson
解析记录的演示,但这些代码不适用于递归数据类型。
答案 0 :(得分:3)
你可以做一些像这样的事情
{-# LANGUAGE OverloadedStrings #-}
import Data.Aeson
import Data.Traversable (traverse)
import Data.Foldable (toList)
import Control.Applicative
data CValue = CList [CValue] | CString Text deriving Show
instance FromJSON CValue where
parseJSON v =
withText "CString" (pure . CString) v
<|> withArray "CList" (\a -> CList . toList <$> traverse parseJSON a) v
设置此实例后,您可以使用decode :: FromJSON a => Data.ByteString.Lazy.Internal.ByteString -> Maybe a
> decode "[[\"a\",\"b\",[\"c\"]]]" :: Maybe CValue
Just (CList [CList [CString "a",CString "b",CList [CString "c"]]])