今天我想解決下一個問題。艾森:默認值的仿製藥
假設我們有類型類定義爲
class DataWithDefault a where
defaultValue :: a
DataWithDefault
而我們定義爲
data Example =
Example { field1 :: Text
, field2 :: Text
} deriving (Show)
instance DataWithDefault Example where
defaultValue = Example "Hello" "World"
instance FromJSON Example where
parseJSON (Object v) =
Example <$> v .:? "field1" .!= field1 defaultValue
<*> v .:? "field2" .!= field2 defaultValue
parseJSON _ = mzero
instance ToJSON Example where
toJSON (Example f1 f2) =
object [ "field1" .= f1
, "field2" .= f2
]
數據Example
我知道埃宋使用泛型自動導出FromJSON
和ToJSON
實例,但我可以不知道如何使它得到FromJSON
實例的默認值爲未在給定的JSON中表示的字段。是否有可能使用泛型?其實我不會問你最終的解決方案,但也許有一些線索?
更新
讓我補充有關問題的詳細信息。
,現在你需要更新你的Example
數據,現在,所以你要更新DataWithDefault
實例聲明
instance DataWithDefault Example where
defaultValue = Example "Hello" "World" 12
我想做的事情定義爲
data Example =
Example { field1 :: Text
, field2 :: Text
, field3 :: Int
} deriving (Show)
假設是不寫
instance FromJSON Example where
parseJSON (Object v) =
Example <$> v .:? "field1" .!= field1 defaultValue
<*> v .:? "field2" .!= field2 defaultValue
<*> v .:? "field3" .!= field3 defaultValue
parseJSON _ = mzero
而想要派生這樣的實例自動定義。更重要的是,我不僅要爲Example
做這件事,還要爲DataWithDefault a
做這件事。
更新2
結合.:?
和.!=
的一點是要獲得儘可能多的從給定的JSON和每一個失蹤字段設置爲它的默認值可能的領域。所以,當我們通過
{ "field1" : "space", "field2" : "ship" }
我想我的新的例子是不是field1 = Hello; field2 = World; field3 = 12
,但field1 = space; field2 = ship; field3 = 12
。
難道你不能'fromMaybe defaultValue $ decode jsonContents'? – bheklilr 2014-10-31 21:52:21
噢,看我的更新 – d12frosted 2014-10-31 22:06:19
如果你正在製作你自己的類型類,你可以考慮使用'Data.Default'來獲得很多結構的實例 – alternative 2014-11-01 13:12:43