Разбор массива с помощью Haskell Aeson
У меня есть документ JSON, который выглядит так:
{ "series": [[1,2], [2,3], [3,4]] }
Я хотел бы разобрать это на набор типов данных:
data Series = Series [DataPoint]
data DataPoint = DataPoint Int Int -- x and y
У меня много проблем, пытаясь написатьFromJSON
экземпляр для DataPoint.
instance FromJSON DataPoint where
parseJSON (Array a) = ???
Я пытался использовать Lens для уничтожения записи DataPoint, но она не компилируется:
case a ^.. values . _Integer of -}
[x,y] -> DataPoint <case a ^.. values . _Integer of -}
[x,y] -> DataPoint <$> x <*> y
_ -> mzero
gt; x <*> y
_ -> mzero
Это терпит неудачу с этой ошибкой (первые две строки, которые я получаю даже без обмана объектива, просто пытаюсь создатьDataPoint <$> 1 <*> 2
):
Couldn't match type ‘aeson-0.7.0.6:Data.Aeson.Types.Internal.Parser
Integer’
with ‘Integer’
Expected type: (aeson-0.7.0.6:Data.Aeson.Types.Internal.Parser
Integer
-> Const
(Data.Monoid.Endo
[aeson-0.7.0.6:Data.Aeson.Types.Internal.Parse
(aeson-0.7.0.6:Data.Aeson.Types.Internal.Parser I
-> Value
-> Const
(Data.Monoid.Endo
[aeson-0.7.0.6:Data.Aeson.Types.Internal.Parser
Value
Actual type: (Integer
-> Const
(Data.Monoid.Endo
[aeson-0.7.0.6:Data.Aeson.Types.Internal.Parse
Integer)
-> Value
-> Const
(Data.Monoid.Endo
[aeson-0.7.0.6:Data.Aeson.Types.Internal.Parser
Value
In the second argument of ‘(.)’, namely ‘_Integer’
In the second argument of ‘(^..)’, namely ‘values . _Integer’
Есть лучший способ сделать это?
У кого-нибудь есть пример разбора массивов значений в более детальную структуру?