Чтение юникода из JSON в поле String с помощью aeson

Я получаю данные JSON, используя httpLbs, и читаю их

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":"Обсуждение рабочих вопросов".

Однако, когда я пытаюсь использовать decode aeson, чтобы поместить это значение в 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 = "\1054\1073\1089\1091\1078\1076\1077\1085\1080\1077 \1088\1072\1073\1086\1095\1080\1093 \1074\1086\1087\1088\1086\1089\1086\1074"}

Похоже, мне нужно настроить aeson, чтобы правильно поместить ByteString в String, но я не хочу сам реализовывать экземпляр FromJSON, потому что у меня есть еще дюжина структур, подобных data Fields. Изменение типа fi_summary также возможно, но пока мне не повезло.


person Me again    schedule 14.08.2015    source источник


Ответы (1)


Если вы видите экранированные символы, значит, данные в строке в порядке. Экземпляр строки по умолчанию Show печатает все не-ASCII-символы, подобные этому. Итак, у вас есть данные, осталось только попытаться правильно их вывести.

Вы можете попробовать использовать putStrLn для печати строки или записать ее в текстовый файл. (Я знаю, что иногда putStrLn делает странные вещи, если локаль установлена ​​неправильно...)

person MathematicalOrchid    schedule 14.08.2015
comment
Да, печать поля напрямую делает это: putStrLn . fi_summary Я принимаю ответ, потому что мне на самом деле не нужно правильное show поведение для моего проекта, но есть ли способ заставить show печатать символы Unicode глобально? (опять десятки структур) - person Me again; 14.08.2015
comment
Нет, о чем я могу думать. Вам придется каким-то образом отменить определение существующего экземпляра Show, а затем написать новый. Я не думаю, что это технически возможно сделать, но я могу ошибаться... - person MathematicalOrchid; 14.08.2015