我们正尝试使用Aeson-JSON hackage使用以下数据解码JSON对象:
data Car = Car
{ carPosition :: Position,
carColor :: Color,
carDirection :: Direction }
deriving (Show, Generic)
为Car
创建了一个实例,对数据类型Postion
,Direction
执行了相同的操作:
instance FromJSON Position
instance FromJSON Direction
instance FromJSON Car
但是现在麻烦开始了,数据类型Color
来自Gloss
hackage,价值是例如写作Red。 Color
数据仅知道deriving Show
,因此无法添加deriving Generic
。我们尝试了以下代码:
instance FromJSON Color where
parseJSON (Object v) = Color <$>
v .: "carColor"
它抱怨不匹配类型Picture -> Picture
,我们期望类似Color
。
我们的问题是:我们如何使用Color
中的数据Gloss
来读取像
{
"carPostion": { "x": 0, "y": 10},
"carColor": "Red",
"carDirection": "Up"
}
我们尝试在没有carColor
的情况下读取JSON对象(仅用于测试目的)并且有效。
更新:看起来像这个问题:Haskell Data.Decimal as Aeson type,除非在我们的情况下,我们要使用Color
,其中给定的Data.Decimal
是麻烦制造者。
答案 0 :(得分:0)
如果你只需要解析基本字符串,这很简单:
instance FromJSON Color where
parseJSON (String s) = maybe mzero return $ stringToColor s
parseJSON _ = mzero
stringToColor :: String -> Maybe Color
stringToColor s
| s == "red" = Just red
| s == "blue" = Just blue
... -- fill in all of your options from Gloss
| otherwise = Nothing
这允许您将一个简单的字符串转换为Color
个对象之一。获得FromJSON
的{{1}}实例后,您可以使用Color
。