例如,我有一些带有一些实体(模块)的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,转换并验证它们?任何帮助将不胜感激=)
答案 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" }
解码。