У меня есть тип данных суммы, который выглядит так:
data Declaration =
IndDecl { what :: String, name :: String, argnames :: Maybe [String], constructors :: [Constructor] }
| TypeDecl { what :: String, name :: String, argnames :: Maybe [String], value :: Maybe Arg }
| FixDecl { what :: String, fixlist :: Maybe [Fixitem] }
| TermDecl { what :: String, name :: String, typ :: Maybe Typ, value :: Maybe Arg }
deriving (Show, Eq)
И я получаю сериализатор / десериализатор JSON, используя Data.Aeson.TH
со следующими параметрами:
$(deriveJSON defaultOptions { sumEncoding = UntaggedValue } ''Declaration)
Это удаляет тег из конструкции JSON. В то же время я думаю, что у моих данных уже есть тег, которым является поле what
. Это может быть одно из следующих значений:
IndDecl : "decl:ind"
FixDecl : "decl:fix"
и т.д. Поэтому тот факт, что я использую конфигурацию без тегов для своих десериализованных объектов JSON, вызывает беспокойство. Как я могу заставить Aeson получать заглушки JSON на основе тегов, которые уже есть в моих данных?
Или, может быть, лучше удалить поле what
и позволить Aeson добавить поле «тег», которое описывает конструктор?
РЕДАКТИРОВАТЬ: Я попробовал последнее, добавив поле тега. Теперь это выглядит так:
-- Declarations
data Declaration =
IndDecl { what :: String, tag :: String, name :: String, argnames :: Maybe [String], constructors :: [Constructor] }
| TypeDecl { what :: String, tag :: String, name :: String, argnames :: Maybe [String], value :: Maybe Arg }
| FixDecl { what :: String, tag :: String, fixlist :: Maybe [Fixitem] }
| TermDecl { what :: String, tag :: String, name :: String, typ :: Maybe Typ, value :: Maybe Arg }
deriving (Show, Eq)
Однако я получаю следующую ошибку:
Ошибка в $ .declarations [0]: ключевой "тег" отсутствует
Чего я не понимаю, так как создал поле «тег».
Data.Aeson.TH
a > предлагает вам использоватьsumEncoding = defaultTaggedObject { tagFieldName = "what" }
существующее ранее поле в качестве тега. - person duplode   schedule 21.04.2018key "tag" not present
, даже когда я добавляю тег? (см. РЕДАКТИРОВАТЬ) - person rausted   schedule 23.04.2018