Haskell Aeson - Gloss - JSON实例解析器:Color

时间:2017-10-27 12:31:17

标签: json haskell types instance aeson

我们正尝试使用Aeson-JSON hackage使用以下数据解码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来自Gloss hackage,价值是例如写作RedColor数据仅知道deriving Show,因此无法添加deriving Generic。我们尝试了以下代码:

instance FromJSON Color where
      parseJSON (Object v) = Color <$>
        v .: "carColor"

它抱怨不匹配类型Picture -> Picture,我们期望类似Color

我们的问题是:我们如何使用Color中的数据Gloss来读取像

这样的JSON对象

{ "carPostion": { "x": 0, "y": 10}, "carColor": "Red", "carDirection": "Up" }

我们尝试在没有carColor的情况下读取JSON对象(仅用于测试目的)并且有效。

更新:看起来像这个问题:Haskell Data.Decimal as Aeson type,除非在我们的情况下,我们要使用Color,其中给定的Data.Decimal是麻烦制造者。

1 个答案:

答案 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