从json解析自定义代数数据类型

时间:2013-09-23 20:14:17

标签: json haskell

例如,我有一些带有一些实体(模块)的json文件:

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

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

我想从这个json构建我的数据类型Module

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

data ModuleType = Type1 | Type2

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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错误(正如Mihai的解决方案可能会发生的那样)
{ "name": "module1", "type": "unconventional-type" }

解码。