FromJSON / ToJSON 当某些字段应该手动解析时

FromJSON / ToJSON when some of the fields should be parsed manually

我有一个数据:

data MyData = MyData { a :: String, b :: Integer, c :: Bool } 
                      deriving (Generic)

instance FromJSON MyData
instance ToJSON MyData

其实我在MyData还有很多字段。

我想手动解析 1 或 2 个字段,因为在 MyData 中,它们的名称与在真实 JSON 对象中的名称略有不同,但仍然能够拥有 FromJSONToJSON 或类似的东西。可能吗?或者在这种情况下我应该手动解析所有字段而不是使用 FromJSON / ToJSON?

您需要查看模板 Haskell deriving abilities of aeson。那里有一个选项可以帮助您重命名字段。例如,假设我想在下面的声明中将 color 字段重命名为 colour

data MyData = MyData { address :: String
                     , streetNumber :: Integer
                     , isApartment :: Bool
                     , color :: String
                     }

然后,我不再推导 Generic,而是添加以下内容

{-# LANGUAGE TemplateHaskell #-}
import Data.Aeson.TH

data MyData = MyData { address :: String
                     , streetNumber :: Integer
                     , isApartment :: Bool
                     , color :: String
                     }

$(deriveJSON defaultOptions{
    constructorTagModifier = \f -> if f == "color" then "colour" else f 
  } ''MyData)

然后我的 ToJSONFromJSON 实例具有适当命名的字段。