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 对象中的名称略有不同,但仍然能够拥有 FromJSON
和ToJSON
或类似的东西。可能吗?或者在这种情况下我应该手动解析所有字段而不是使用 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)
然后我的 ToJSON
和 FromJSON
实例具有适当命名的字段。
我有一个数据:
data MyData = MyData { a :: String, b :: Integer, c :: Bool }
deriving (Generic)
instance FromJSON MyData
instance ToJSON MyData
其实我在MyData
还有很多字段。
我想手动解析 1 或 2 个字段,因为在 MyData
中,它们的名称与在真实 JSON 对象中的名称略有不同,但仍然能够拥有 FromJSON
和ToJSON
或类似的东西。可能吗?或者在这种情况下我应该手动解析所有字段而不是使用 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)
然后我的 ToJSON
和 FromJSON
实例具有适当命名的字段。