正确地将JSON数组解析为自定义数据类型对象

时间:2019-07-01 12:04:21

标签: json haskell aeson

我在Haskell中定义了以下数据类型对象:

import GHC.Generics
import Data.Aeson
import qualified Data.ByteString.Lazy.Char8 as C
import Data.Maybe (fromJust)

data DLA = DLA {
                a::String,
                b::Int,
                c::Int,
                d::String,
                e::[Int]
                } deriving (Show, Generic)

instance FromJSON DLA
instance ToJSON DLA

并以以下格式从某些前端应用程序接收json数组

[\"hello\",3,2,\"world\",[1,3,5]]

当我尝试像这样解析

decode $ C.pack "[\"hello\",3,2,\"world\",[1,3,5]]"::Maybe DLA

它只是返回了Nothing。尝试像

这样更笼统地传递它

decode $ C.pack "[\"hello\",3,2,\"world\",[1,3,5]]"::Maybe Value

返回以下输出:

Just (Array [String "hello",Number 3.0,Number 2.0,String "world",Array [Number 1.0,Number 3.0,Number 5.0]])

所以问题似乎在于Haskell将字符串解释为数组,而不是对象,因此正确地引发了异常。任何想法如何解决这一问题?

我正在使用ghc和ghci的当前版本以及Data.Aeson。

1 个答案:

答案 0 :(得分:1)

我找到了一个使用模式匹配的简单解决方案,但是也欢迎使用更直接的方法,因为我认为应该有一些功能。

raw = fromJust (decode $ C.pack "[\"hello\",3,2,\"world\",[1,3,5]]"::Maybe (String, Int, Int,   String, [Int]))

func::(String, Int, Int, String, [Int]) -> DLA
func (a,b,c,d,e) = DLA a b c d e