Эффективный анализ Aeson для типа суммы toEncoding - PullRequest
3 голосов
/ 05 марта 2019

Я анализирую стороннюю структуру JSON в свой собственный набор типов. Я хотел бы проанализировать наиболее эффективным способом (я анализирую данные, отправленные через сокет Unix с Network.Socket)

Документация Aeson утверждает, что синтаксический анализ с toEncoding приводит к ускорению в 3 раза по сравнению с toJSON, однако я не понимаю, как написать действительный экземпляр, используя 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 Ответ

3 голосов
/ 05 марта 2019

Насколько я знаю, Aeson не предоставляет альтернативу fromJSON для разбора / декодирования.Документы объясняют, что toEncoding позволяет более эффективно кодировать / сериализовать - от представления в памяти Haskell до проводного формата.Из вашего вопроса не ясно, в каком направлении вам нужно быть быстрым.

Вы можете указать явное toEncoding, следуя шаблону вашего toJSON. Data.Aeson.Encoding предоставляет набор вспомогательных функций для написания этих строк:

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