避免 Aeson 中的字符串往返

Avoiding String round-trip in Aeson

我有以下代码(应该解析一个非常简单的 { "url": "http://some.url.here/" } 散列):

import           Control.Applicative
import qualified Data.ByteString       as B
import           Data.ByteString.Char8 (pack)


import           Data.Aeson            ()
import           Data.Aeson.Types



newtype SetNextUrl = SetNextUrl B.ByteString

instance FromJSON SetNextUrl where 
    parseJSON (Object v) = SetNextUrl <$>
        (pack <$> v .: "url" )

现在请注意,我通过使用 pack 来暗示 "url" 是字符串类型...这当然会导致一些转换开销:从输入 ByteString 到 [Char]然后回来....

问题:如何让 Aeson 将 "url" 字段解释为 ByteString?

aeson 在内部使用 Text 作为字符串值,所以如果你使用 Data.Text.Encoding.encodeUtf8 你不会有 Text -> String -> ByteString 转换,它会直接从Text -> ByteString(iirc 相当便宜)