Если у меня есть тип данных, который выглядит так:
data SumType = ABC | DEF deriving (Generic, ToJSON)
data MyType = MyType {field1 :: String, field2 :: SumType} deriving (Generic, ToJSON)
Приведенное выше сгенерирует JSON, который выглядит так: {"field1": "blah", "field2":"ABC"}
На практике MyType
является довольно сложным типом, и я хотел бы сохранить ToJSON
производное, но хочу настроить только одно поле для использования экземпляра show.
instance Show SumType where
show ABC = "abc-blah"
show DEF = "def-xyz"
К сожалению, указанный выше экземпляр Show
не подхватывается ToJSON
(я не знаю, должен ли он это делать). Ручная прокрутка ToJSON
для SumType
не кажется эффективной, потому что ожидает пары "ключ-значение" (может быть, есть другой способ сделать это?). Другими словами, JSON будет выглядеть так: {"field1": "blah", "field2":{"field3": "ABC"}}
- Я просто хочу изменить способ преобразования значения в строку, а не создавать там новый объект.
Любые предложения о том, как изменить строку вывода SumType
, не создавая вручную ToJSON
для MyType
? Таким образом, на выходе получается {"field1": "blah", "field2":"abc-blah"}
Спасибо!
ToJSON
дляSumType
? Вы можете использовать определение вShow SumType
. - person Willem Van Onsem   schedule 01.11.2017ToJSON
принимает толькоobjects
. Я не понимал, что могу просто вернуть строку. Если вы вложите свой ответ в ответ, я могу его принять. - person Ecognium   schedule 01.11.2017