Ответ 1
Если вы используете GHC 7.2 или 7.4, поддержка новых дженериков в aeson
не проверяет наличие дополнительных полей. Я не уверен, что это по дизайну или нет, но мы используем его по той же причине.
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE OverloadedStrings #-}
import Data.Aeson
import qualified Data.Aeson.Types
import Data.Attoparsec
import qualified Data.ByteString as BS
import Data.ByteString.Char8 ()
import GHC.Generics
data MyRecord = MyRecord
{ field1 :: Int
} deriving (Generic, Show)
instance FromJSON MyRecord
myRecordFromJSONString :: BS.ByteString -> Maybe MyRecord
myRecordFromJSONString s = case Data.Attoparsec.parse json s of
Done _rest res -> Data.Aeson.Types.parseMaybe parseJSON res
_ -> Nothing
main :: IO ()
main = do
let parsed = myRecordFromJSONString "{ \"field1\": 1, \"field2\": 2 }"
print parsed
Выполнение этого завершится неудачей с экземпляром TH из-за того, что в записи не было "field2". Экземпляр Generic
возвращает желаемый результат:
Just (MyRecord {field1 = 1})