gpt4 book ai didi

json - Haskell - 使用 aeson 生成 JSON 会导致字段顺序不正确

转载 作者:行者123 更新时间:2023-12-04 22:43:31 26 4
gpt4 key购买 nike

我正在尝试将数据类型编码为 JSON:

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}

import Data.Aeson

data Trend = Trend
{ period :: String
, africa :: String
, americas :: String
, asia :: String
} deriving Show

instance ToJSON Trend where
toJSON Trend{..} =
object [ "Period" .= period
, "Africa" .= africa
, "Americas" .= americas
, "Asia" .= asia
]

test = Trend {period = "2013", africa = "1", americas = "2", asia = "3"}

这使:
λ: encode test
λ: "{\"Asia\":\"3\",\"Period\":\"2013\",\"Africa\":\"1\",\"Americas\":\"2\"}"

我不明白为什么生成的 JSON 的字段顺序与我的数据类型不同。

我期望输出是 {period, africa, americas, asia} 我得到 {asia, period, africa, americas)

我知道在传递信息时,顺序并不重要,但我很好奇为什么会发生这种情况。

最佳答案

您可以使用 toEncodingaeson-0.10 开始可用的方法(如果可能,请使用 aeson-0.11)。在这种情况下,您可以更好地控制生成的结构:

instance ToJSON Trend where
toJSON Trend{..} =
object [ "Period" .= period
, "Africa" .= africa
, "Americas" .= americas
, "Asia" .= asia
]

toEncoding Trend {..} =
pairs $ "Period" .= period
<> "Africa" .= africa
<> "Americas" .= americas
<> "Asia" .= asia

或者如果这样简单,值得使用 Generic推导
instance ToJSON Trend where
toJSON = genericToJSON defaultOptions { fieldLabelModifier = capitaliseFirst }
where
capitaliseFirst (x:xs) = toUpper x : xs
capitaliseFirst [] = []

关于json - Haskell - 使用 aeson 生成 JSON 会导致字段顺序不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37865388/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com