1

例如,我有这样的 json 文件,其中包含一些实体(模块):

{ 
    "name"  : "module1",
    "type"   : "Type1"
},

{
    "name"  : "module2",
    "type"   : "Type2"
}

我想从这个json构造我的数据类型模块

data Module = Module {name::String, type :: ModuleType}

data ModuleType = Type1 | Type2

从 json 构建这种数据类型的最方便的方法是什么?如何解析我的自定义类型 Type1 和 Type2、转换和验证它们?任何帮助将不胜感激 =)

4

2 回答 2

3

我建议您使用惊人的aeson模块。它非常快,非常容易理解,您可以快速开发解析逻辑。它甚至在页面的开头有一些示例,您可以在代码中使用该示例 99%。

instance FromJSON Module where
    parseJSON (Object v) = build <$>
                           v .: "name" <*>
                           v .: "type"
    -- A non-Object value is of the wrong type, so fail.
    parseJSON _          = mzero

build :: String -> String -> Module
build name "Type1" = Module name Type1
build name "Type2" = Module name Type2
于 2013-09-23T20:20:29.957 回答
0

理想情况下,您想为数据类型编写自己的FromJSON实例ModuleType

instance FromJSON Module where
    parseJSON (Object v) = Module <$>
                           v .: "name" <*>
                           v .: "type"
    parseJSON _          = mzero

instance FromJSON ModuleType where
    parseJSON (String t) = case t of
                               "Type1" -> return Type1
                               "Type2" -> return Type2
                               _       -> mzero
    parseJSON _          = mzero

这样non-exhaustive pattern当有人给你一个像

{ "name": "module1", "type": "unconventional-type" }

解码。

于 2014-03-31T23:52:29.773 回答