У меня есть тип данных, где один из полей представляет собой список один из n
других типов данных (n
мал и типы известны заранее). Я хотел бы сделать парсер JSON, но я не могу это понять. Я попытался создать класс типа Pet и сделать их обоими экземплярами, но он казался тупиком. Любая помощь будет оценена!Синтаксического гомогенного полиморфного массив JSon
В упрощенном примере - у меня есть тип Person
данных, которые могут иметь список домашних животных, либо собаки или кошки - но не сочетание обоих.
Вот пример:
{-# LANGUAGE OverloadedStrings #-}
import Control.Applicative
import Data.Aeson
import Data.ByteString.Lazy as L
import Data.Aeson.Types (Parser)
import Control.Monad (mzero)
data Person = Person {
name :: String,
species :: String,
pets :: [?] -- a list of dogs OR cats
} deriving Show
instance FromJSON (Person a) where
parseJSON (Object v) = ???
data Dog = Dog {
dogField :: String
} deriving Show
instance FromJSON Dog where
parseJSON (Object v) = Dog <$>
v .: "dogField"
data Cat = Cat {
catField :: String
} deriving Show
instance FromJSON Cat where
parseJSON (Object v) = Cat <$>
v .: "catField"
Необходимо ли ваши требования, что 'pets' не имеет кошек и собак в то же время, или это просто упрощающее предположение? – duplode
Возможно, это не существенно, но оно отражает мою текущую модель данных. Но решение без этого предположения также было бы здорово! – sportanova
Если вы действительно хотите разделить кошек и собак, естественным делом является наличие отдельных списков разных типов в «Человеке». – duplode