Взгляните на документы для ToJSONKey
. По сути, метод toJSONKey :: ToJSONKeyFunction a
обрабатывает два случая:
- когда вы можете превратить ключ непосредственно в текст типа
- когда лучшее, что вы можете сделать, это превратить ключ в какой-то общий JSON
Для первого из них aeson
будет использовать правильный объект JSON. Для последнего он возвращается к вложенным массивам.
Так почему же в вашем случае выбирается второй вариант? Потому что вы получаете ToJSONKey
, а реализация по умолчанию выбирает второй более общий вариант. Вы можете обойти эту проблему, вручную внедрив ToJSONKey LOL
:
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DeriveAnyClass #-}
import Data.Aeson
import Data.Aeson.Types
import qualified Data.Text as T
import qualified Data.Map.Strict as M
import qualified Data.ByteString.Lazy.Char8 as B
import GHC.Generics
data LOL = A | B | C deriving (Eq, Ord, Show, Generic, ToJSON)
instance ToJSONKey LOL where
toJSONKey = toJSONKeyText (T.pack . show)
main = do
B.putStrLn $ encode $ M.fromList [(A,"b")]
B.putStrLn $ encode $ M.fromList [("A","b")]
Это должно дать вам
$ ./tojsonkey
{"A":"b"}
{"A":"b"}