Haskell Aeson - Gloss - JSON 实例解析器:颜色
Haskell Aeson - Gloss - JSON instance parser: Color
我们正在尝试使用以下数据使用 Aeson-JSON 黑客攻击来解码 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
comes from the Gloss
hackage and the value is e.g. written as Red。 Color
数据只知道:deriving Show
,所以不可能添加 deriving Generic
。我们尝试了以下代码:
instance FromJSON Color where
parseJSON (Object v) = Color <$>
v .: "carColor"
它抱怨不匹配类型 Picture -> Picture
而我们期望的是 Color
。
我们的问题是:我们如何使用 Gloss
中的数据 Color
来读取 JSON 对象,例如
{
"carPostion": { "x": 0, "y": 10},
"carColor": "Red",
"carDirection": "Up"
}
我们尝试在不使用 carColor
的情况下读取 JSON 对象(仅用于测试目的)并且有效。
更新:看起来像这个问题:Haskell Data.Decimal as Aeson type 除了在我们的例子中,我们想使用 Color
,其中给定的 Data.Decimal
是麻烦制造者。
如果您只需要解析基本字符串,这非常简单:
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
对象之一。一旦你有了 Color
的 FromJSON
实例,你就可以使用 instance FromJSON Car
。
我们正在尝试使用以下数据使用 Aeson-JSON 黑客攻击来解码 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
comes from the Gloss
hackage and the value is e.g. written as Red。 Color
数据只知道:deriving Show
,所以不可能添加 deriving Generic
。我们尝试了以下代码:
instance FromJSON Color where
parseJSON (Object v) = Color <$>
v .: "carColor"
它抱怨不匹配类型 Picture -> Picture
而我们期望的是 Color
。
我们的问题是:我们如何使用 Gloss
中的数据 Color
来读取 JSON 对象,例如
{
"carPostion": { "x": 0, "y": 10},
"carColor": "Red",
"carDirection": "Up"
}
我们尝试在不使用 carColor
的情况下读取 JSON 对象(仅用于测试目的)并且有效。
更新:看起来像这个问题:Haskell Data.Decimal as Aeson type 除了在我们的例子中,我们想使用 Color
,其中给定的 Data.Decimal
是麻烦制造者。
如果您只需要解析基本字符串,这非常简单:
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
对象之一。一旦你有了 Color
的 FromJSON
实例,你就可以使用 instance FromJSON Car
。