我是 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)
.:
运算符的第二个参数应为 Key
类型,但您传入的是 [Char]
(也称为 String
)。尝试以下其中一项将它们转换为 Key
:
启用
OverloadedStrings
扩展。即,将 {-# LANGUAGE OverloadedStrings #-}
添加到源代码的顶部。
代替
"Name"
,尝试使用 fromString "Name"
。同样,尝试使用 "ColumnType"
,而不是 fromString "ColumnType"
。 fromString
应从 Data.Aeson.Key 模块导入。这实际上与第一个选项执行相同的操作,但是 OverloadedStrings
扩展可以为您执行此操作。