Ho un documento JSON che assomiglia:il parsing di un array con Haskell Aeson
{ "series": [[1,2], [2,3], [3,4]] }
mi piacerebbe analizzare questo in una serie di tipi di dati:
data Series = Series [DataPoint]
data DataPoint = DataPoint Int Int -- x and y
sto avendo molti problemi nel tentativo di scrivere l'istanza FromJSON
per DataPoint.
instance FromJSON DataPoint where
parseJSON (Array a) = ???
Ho provato con obiettivo di distruggere il record DataPoint, ma non compila:
case a ^.. values . _Integer of -}
[x,y] -> DataPoint <$> x <*> y
_ -> mzero
che non riesce con questo errore (le prime due righe ottengo addirittura assente l'inganno della lente , solo cercando di creare un 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’
c'è un modo migliore per fare questo?
Qualcuno ha un esempio di analisi di matrici di valori in una struttura più dettagliata?
[Ecco un esempio] (https://gist.github.com/bheklilr/98ac8f8e663cf02fcaa6) ho scritto qualche tempo fa per qualcun altro, potrebbe dare un buon inizio. – bheklilr
Grazie a bheklilr, ma il problema che sto incontrando non è l'analisi di Aeson (l'analisi degli oggetti è abbastanza semplice), ma focalizzata sulla destrutturazione di un array in un tipo di dati più semantico. L'array ha '[X, Y]', dove sono due significati semantici diversi, che sono indicati solo dall'indice. Voglio analizzarlo in un vero tipo di dati 'DataPoint Int Int 'che posso affinare i tipi e i nomi in basso per essere esattamente ciò che dovrebbe significare. – cschneid