Tôi có một doc JSON trông giống như:Phân tích một Array với Haskell Aeson
{ "series": [[1,2], [2,3], [3,4]] }
Tôi muốn phân tích này vào một tập hợp các kiểu dữ liệu:
data Series = Series [DataPoint]
data DataPoint = DataPoint Int Int -- x and y
Tôi đang gặp rất nhiều sự cố khi cố gắng viết ví dụ FromJSON
cho DataPoint.
instance FromJSON DataPoint where
parseJSON (Array a) = ???
Tôi đã cố gắng sử dụng thấu kính để hủy bản ghi Datapoint, nhưng nó không biên dịch:
case a ^.. values . _Integer of -}
[x,y] -> DataPoint <$> x <*> y
_ -> mzero
Đó không thành công với lỗi này (hai dòng đầu tiên tôi nhận được thậm chí vắng mặt những thủ đoạn gian trá ống kính , chỉ cần cố gắng để tạo ra một 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ó cách nào tốt hơn để làm điều này?
Có ai có ví dụ về phân tích mảng giá trị thành cấu trúc chi tiết hơn không?
[Dưới đây là một ví dụ] (https://gist.github.com/bheklilr/98ac8f8e663cf02fcaa6) Tôi đã viết lên một lúc trước cho người khác, nó có thể cung cấp cho bạn một khởi đầu tốt. – bheklilr
Cảm ơn bheklilr, nhưng vấn đề tôi đang gặp phải không phải là phân tích cú pháp của Aeson (Phân tích cú pháp đối tượng là dễ dàng), nhưng tập trung vào việc phá hủy một mảng thành một kiểu dữ liệu ngữ nghĩa hơn. Mảng có '[X, Y]', trong đó chúng có hai ý nghĩa ngữ nghĩa khác nhau, chỉ được biểu thị bằng chỉ mục. Tôi muốn phân tích cú pháp đó thành một kiểu dữ liệu thực 'DataPoint Int Int' để tôi có thể tinh chỉnh các loại và tên xuống chính xác những gì nó cần phải có ý nghĩa. – cschneid