避免 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 相当便宜)
我有以下代码(应该解析一个非常简单的 { "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 相当便宜)