sum 类型 toEncoding 的高效 Aeson 解析
Efficient Aeson parsing for sum type toEncoding
我正在将第三方 JSON 结构解析为我自己的类型集。我想以最有效的方式进行解析(我正在解析通过 Network.Socket 的 unix 套接字发送的数据)
Aeson 的文档声称使用 toEncoding 进行解析的速度比 toJSON 高 3 倍,但是我不明白如何使用 toEncoding 为我的简单求和类型编写有效实例。
例如:
data NodeLayout =
SplitHorizontalLayout
| SplitVerticalLayout
| StackedLayout
| TabbedLayout
| DockAreaLayout
| OutputLayout
deriving (Eq, Generic)
instance ToJSON NodeLayout where
toJSON = \case
SplitHorizontalLayout -> "splith"
SplitVerticalLayout -> "splitv"
StackedLayout -> "stacked"
TabbedLayout -> "tabbed"
DockAreaLayout -> "dockarea"
OutputLayout -> "output"
instance FromJSON NodeLayout where
parseJSON (String s) = pure $ case s of
"splith" -> SplitHorizontalLayout
"splitv" -> SplitVerticalLayout
"stacked" -> StackedLayout
"tabbed" -> TabbedLayout
"dockarea" -> DockAreaLayout
"output" -> OutputLayout
_ -> error "Received unrecognized NodeLayout"
parseJSON _ = error "Error parsing NodeLayout"
我有其他数据类型可以接收此向量,但有时我会收到需要单独解析的单个值。如何使用 toEncoding 高效地将字符串解析为求和类型?
据我所知,Aeson 没有提供 fromJSON
的替代方法来解析/解码。文档解释说 toEncoding
允许更有效的编码/序列化——从 Haskell 内存中表示到有线格式。从你的问题看不清楚你要求哪个方向快。
您可以按照 toJSON
的模式提供明确的 toEncoding
。 Data.Aeson.Encoding 提供了一堆辅助函数来编写这些:
toEncoding = \case
SplitHorizontalLayout -> text "splith"
SplitVerticalLayout -> text "splitv"
StackedLayout -> text "stacked"
TabbedLayout -> text "tabbed"
DockAreaLayout -> text "dockarea"
OutputLayout -> text "output"
我正在将第三方 JSON 结构解析为我自己的类型集。我想以最有效的方式进行解析(我正在解析通过 Network.Socket 的 unix 套接字发送的数据)
Aeson 的文档声称使用 toEncoding 进行解析的速度比 toJSON 高 3 倍,但是我不明白如何使用 toEncoding 为我的简单求和类型编写有效实例。
例如:
data NodeLayout =
SplitHorizontalLayout
| SplitVerticalLayout
| StackedLayout
| TabbedLayout
| DockAreaLayout
| OutputLayout
deriving (Eq, Generic)
instance ToJSON NodeLayout where
toJSON = \case
SplitHorizontalLayout -> "splith"
SplitVerticalLayout -> "splitv"
StackedLayout -> "stacked"
TabbedLayout -> "tabbed"
DockAreaLayout -> "dockarea"
OutputLayout -> "output"
instance FromJSON NodeLayout where
parseJSON (String s) = pure $ case s of
"splith" -> SplitHorizontalLayout
"splitv" -> SplitVerticalLayout
"stacked" -> StackedLayout
"tabbed" -> TabbedLayout
"dockarea" -> DockAreaLayout
"output" -> OutputLayout
_ -> error "Received unrecognized NodeLayout"
parseJSON _ = error "Error parsing NodeLayout"
我有其他数据类型可以接收此向量,但有时我会收到需要单独解析的单个值。如何使用 toEncoding 高效地将字符串解析为求和类型?
据我所知,Aeson 没有提供 fromJSON
的替代方法来解析/解码。文档解释说 toEncoding
允许更有效的编码/序列化——从 Haskell 内存中表示到有线格式。从你的问题看不清楚你要求哪个方向快。
您可以按照 toJSON
的模式提供明确的 toEncoding
。 Data.Aeson.Encoding 提供了一堆辅助函数来编写这些:
toEncoding = \case
SplitHorizontalLayout -> text "splith"
SplitVerticalLayout -> text "splitv"
StackedLayout -> text "stacked"
TabbedLayout -> text "tabbed"
DockAreaLayout -> text "dockarea"
OutputLayout -> text "output"