【问题标题】:FromJSON / ToJSON when some of the fields should be parsed manuallyFromJSON / ToJSON 当某些字段需要手动解析时
【发布时间】:2016-12-04 16:48:08
【问题描述】:

我有一个数据:

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

【问题讨论】:

标签: json haskell aeson


【解决方案1】:

你会想看看模板 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 实例具有适当命名的字段。

【讨论】:

  • 顺便说一句,有没有办法使用模板 haskell 生成“导入”或“合格导入”列表,以便像我手动添加它们一样编译?
  • @Orado 我不知道。也许其他人对此会有想法。
  • 好的。是否可以不解析 FromJSON 实现中的所有字段,而只解析我想要的字段,因为其他字段与我无关?
  • @Orado 这会自动发生。如果您的 JSON 对象的字段多于您的需要,那么多余的字段将被忽略。
  • 无论如何你应该派生出Generic;各种其他类都需要它作为默认值。
猜你喜欢
  • 1970-01-01
  • 2020-11-25
  • 2019-10-23
  • 1970-01-01
  • 1970-01-01
  • 2012-08-19
  • 1970-01-01
  • 2011-05-01
  • 2014-07-25
相关资源
最近更新 更多