如何解码Haskell中的递归JSON数组?

时间:2015-04-29 01:36:16

标签: json haskell

对于这样的JSON:

[
  [
    "a",
    "b",
    [
      "c"
    ]
  ]
]

如何在Haskell中解码它?

这是JSON中的递归数组:

data CValue = CList [CValue] | CString String

我已经阅读了使用JSON.textAeson解析记录的演示,但这些代码不适用于递归数据类型。

1 个答案:

答案 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"]]])