【问题标题】:Haskell Aeson - Gloss - JSON instance parser: ColorHaskell Aeson - Gloss - JSON 实例解析器:颜色
【发布时间】:2017-10-28 00:17:45
【问题描述】:

我们正在尝试使用以下数据使用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,其值为 e.g.写成RedColor 数据只知道:deriving Show,所以不可能添加deriving Generic。我们尝试了以下代码:

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

它抱怨与Picture -&gt; 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 是麻烦制造者。

【问题讨论】:

  • Color 看起来像什么?此外,您以这种方式解析它对我来说没有多大意义。我希望 parseJSON 解析 JSON 字符串或类似的东西。
  • @WillemVanOnsem 我已经更新了我的问题。主要问题是Color,没有这个属性我们可以用给定的代码成功地读取一个JSON对象。

标签: json haskell types instance aeson


【解决方案1】:

如果您只需要解析基本字符串,这非常简单:

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

【讨论】:

  • 谢谢,我想没有直接的方法可以做到这一点(不从字符串转换为颜色)。无论如何,这解决了pur问题:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多