Я пытаюсь разобрать JSON для создания типа с несколькими конструкторами. Проблема состоит в том, что тип кодируется в имени ключа, который содержит требуемые данные. В теории я мог бы использовать кучу .:?
звонков, а затем проверить, возвращает ли данный ключ Just
, но я думаю, что должен быть лучший способ. Я посмотрел на asum
, но это не очень помогло мне (возможно, из-за моей незнакомости с ним).Анализ Aeson на несколько конструкторов
import Data.Aeson
import Data.Time.Clock
data Request = Req1 { id :: String, properties :: Value }
| Req2 { id :: String, properties :: Value }
| Req3 { id :: String, time :: UTCTime }
instance FromJSON Request where
parseJSON = withObject "message" $ \o ->
-- ???
Пример запросов:
{"req1": {"id": "345", "p1": "v1", "p2": "v2"}}
{"req2": {"id": "654", "p3", "v3"}}
{"req3": {"id": "876", "time": 1234567890}}
Можете ли вы не использовать другой тип для каждого отдельного объекта запроса? – jkeuhlen
Также см. Http://stackoverflow.com/questions/32421836/aeson-parsing-dynamic-keys-as-type-field?rq=1 –