在 Haskell 中使用 aeson 反序列化 JSON 文件

问题描述 投票:0回答:1

我是 Haskell 新手。目前我正在开发一个“SQL”项目,并且我陷入了反序列化 JSON 文件内容的困境。我遇到了一些该死的错误,但我不知道如何修复它。 这就是我的文件的样子:

{

"Table":"flags",

"Columns":[

{"Name":"flag", "ColumnType":"StringType"},

{"Name":"value", "ColumnType":"BoolType"}],

"Rows":[

[{"Value":"StringValue a"}, {"Value":"BoolValue True"}],

[{"Value":"StringValue b"}, {"Value":"BoolValue True"}],

[{"Value":"StringValue b"}, {"Value":"NullValue"}],

[{"Value":"StringValue b"}, {"Value":"BoolValue False"}]

]

}

这就是我一直在做的事情:

data FromJSONColumn = FromJSONColumn {

deserializedName :: String,

deserializedDataType :: String

} deriving (Show, Eq, Generic)



instance FromJSON FromJSONColumn where

parseJSON (Object v) =

FromJSONColumn <$> v .: "Name"

<*> v .: "ColumnType"

parseJSON _ = mzero

我不明白我需要做什么来解决这个错误:

有人可以解释如何为此类文件(包含表的文件)编写实例吗?我该怎么做呢?我真的迷失了。

附注这是我正在使用的数据框:

data ColumnType
= IntegerType
| StringType
| BoolType
deriving (Show, Eq)
data Column = Column String ColumnType
deriving (Show, Eq)
data Value
= IntegerValue Integer
| StringValue String
| BoolValue Bool
| NullValue
deriving (Show, Eq)
type Row = [Value]
data DataFrame = DataFrame [Column] [Row]
deriving (Show, Eq)
json haskell deserialization aeson
1个回答
0
投票

.:
运算符的第二个参数应为
Key
类型,但您传入的是
[Char]
(也称为
String
)。尝试以下其中一项将它们转换为
Key
:

  1. 启用

    OverloadedStrings
    扩展。即,将
    {-# LANGUAGE OverloadedStrings #-}
    添加到源代码的顶部。

  2. 代替

    "Name"
    ,尝试使用
    fromString "Name"
    。同样,尝试使用
    "ColumnType"
    ,而不是
    fromString "ColumnType"
    fromString
    应从 Data.Aeson.Key 模块导入。这实际上与第一个选项执行相同的操作,但是
    OverloadedStrings
    扩展可以为您执行此操作。

© www.soinside.com 2019 - 2024. All rights reserved.