有效的Aeson解析,将总和类型转换为Encoding

时间:2019-03-05 19:06:59

标签: json parsing haskell aeson

我正在将第三方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有效地将字符串解析为求和类型?

1 个答案:

答案 0 :(得分:3)

据我所知,Aeson并未提供fromJSON的替代方案来进行解析/解码。文档解释说toEncoding允许更有效的编码/序列化-从Haskell内存表示形式到有线格式。从您的问题尚不清楚,您需要朝哪个方向快速前进。

您可以按照toEncoding的模式提供明确的toJSONData.Aeson.Encoding提供了许多用于编写以下内容的辅助函数:

    toEncoding = \case
        SplitHorizontalLayout -> text "splith"
        SplitVerticalLayout   -> text "splitv"
        StackedLayout         -> text "stacked"
        TabbedLayout          -> text "tabbed"
        DockAreaLayout        -> text "dockarea"
        OutputLayout          -> text "output"