我有一個JSON文檔看起來像:解析哈斯克爾埃宋陣列
{ "series": [[1,2], [2,3], [3,4]] }
我想解析成一組數據類型是:
data Series = Series [DataPoint]
data DataPoint = DataPoint Int Int -- x and y
我有嘗試爲DataPoint編寫FromJSON
實例時出現了很多問題。
instance FromJSON DataPoint where
parseJSON (Array a) = ???
我用鏡頭來破壞數據點紀錄試過,但它不會編譯:
case a ^.. values . _Integer of -}
[x,y] -> DataPoint <$> 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’
有沒有更好的方式來做到這一點?
有沒有人有一個解析值的數組到一個更詳細的結構的例子?
[下面是一個例子(https://gist.github.com/bheklilr/98ac8f8e663cf02fcaa6),我前一段時間寫了別人,可能會給你一個良好的開端。 – bheklilr
感謝bheklilr,但是我遇到的問題並不是Aeson的解析(對象解析很簡單),而是專注於將數組解析爲更多語義數據類型。該數組具有'[X,Y]',它們是兩個不同的語義含義,僅由索引指示。我想將其解析爲一個真正的數據類型'DataPoint Int Int',我可以將這些類型和名稱精確到它應該的含義。 – cschneid