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 创建了一个实例,并对数据类型 PostionDirection:

执行了相同的操作
instance FromJSON Position
instance FromJSON Direction
instance FromJSON Car

但是现在麻烦开始了,数据类型Color comes from the Gloss hackage and the value is e.g. written as RedColor 数据只知道: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 对象之一。一旦你有了 ColorFromJSON 实例,你就可以使用 instance FromJSON Car