代码之家  ›  专栏  ›  技术社区  ›  Viletung

Haskell Aeson-Gloss-JSON实例解析器:颜色

  •  0
  • Viletung  · 技术社区  · 7 年前

    我们正在尝试使用 Aeson-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 Red 颜色 数据只知道: deriving Show ,因此不可能添加 deriving Generic . 我们尝试了以下代码:

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

    它抱怨类型不匹配 Picture -> Picture 我们期望的是 颜色

    我们的问题是:我们如何使用这些数据 颜色 从…起 光泽

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

    我们尝试在没有 carColor (仅用于测试目的)这是可行的。

    更新:看起来像这样的问题: Haskell Data.Decimal as Aeson type 除了我们想使用 颜色 在给定的情况下 Data.Decimal 是麻烦制造者。

    1 回复  |  直到 7 年前
        1
  •  0
  •   jkeuhlen    7 年前

    如果您只需要解析基字符串,那么这很简单:

    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 实例 颜色 ,您可以使用 instance FromJSON Car .