使用 aeson 将 unicode 从 JSON 读取到 String 字段

Read unicode from JSON to String field using aeson

我使用 httpLbs 收到 JSON 数据并读取它

import qualified Data.ByteString.Lazy.UTF8 as LB

sendSimpleRequest :: Credentials -> IO LB.ByteString
sendSimpleRequest creds = do
    <...>
    let request = applyBasicAuth user pass $ fromJust $ parseUrl url
    manager <- newManager tlsManagerSettings
    response <- httpLbs request manager
    return $ responseBody response

之后,我可以用putStr . LB.toString打印结果并得到"summary":"Обсуждение рабочих вопросов"

但是,当我尝试使用 aesondecode 将此值放入 data 并打印时

data Fields = Fields
    { fi_summary :: String
    } deriving (Show, Generic)

instance FromJSON Fields where parseJSON = genericParseJSON parseOptions
instance ToJSON Fields where toJSON = genericToJSON parseOptions

parseOptions :: Options
parseOptions = defaultOptions { fieldLabelModifier = drop 3 }

parseAndShow = putStr . show . fromJust . decode

我得到转义字符:Fields {fi_summary = "54738991787677858077 88727386958093 7486878886898674"}

似乎我需要配置 aeson 才能正确地将 ByteString 放入 String,但我不想自己实现 FromJSON 实例,因为我有还有十几个结构,例如 data Fields。更改 fi_summary 类型也是一种可能,但到目前为止我没有任何运气。

如果您看到转义字符,则说明字符串中的数据很好。默认字符串 Show 实例打印所有非 ASCII 字符,如下所示。所以你得到了数据,这只是一个尝试适当地再次输出它的问题。

您可以尝试使用 putStrLn 打印字符串,或者将其写入文本文件。 (我知道如果语言环境设置错误,有时 putStrLn 会做出奇怪的事情...)