Aeson не декодирует строки с символами Юникода

Я пытаюсь использовать Data.Aeson (https://hackage.haskell.org/package/aeson-0.6.1.0/docs/Data-Aeson.html) для декодирования некоторых строк JSON, однако не удается проанализировать строки, содержащие нестандартные символы.

Например, файл:

import Data.Aeson
import Data.ByteString.Lazy.Char8 (pack)

test1 :: Maybe Value
test1 = decode $ pack "{ \"foo\": \"bar\"}"

test2 :: Maybe Value
test2 = decode $ pack "{ \"foo\": \"bòz\"}"

При запуске в ghci дает следующие результаты:

*Main> :l ~/test.hs
[1 of 1] Compiling Main             ( /Users/ltomlin/test.hs, interpreted )
Ok, modules loaded: Main.
*Main> test1
Just (Object fromList [("foo",String "bar")])
*Main> test2
Nothing

Есть ли причина, по которой он не анализирует строку с символом юникода? У меня сложилось впечатление, что Haskell неплохо справляется с юникодом. Любые предложения будут ценны!

Спасибо,

тетиги

РЕДАКТИРОВАТЬ

После дальнейшего изучения с использованием eitherDecode я получаю следующее сообщение об ошибке:

 *Main> test2
 Left "Failed reading: Cannot decode byte '\\x61': Data.Text.Encoding.decodeUtf8: Invalid UTF-8 stream"

x61 — это символ Юникода для «z», который идет сразу после специального символа Юникода. Не уверен, почему он не может прочитать символы после специального символа!

Изменение test2 на test2 = decode $ pack "{ \"foo\": \"bòz\"}" вместо этого дает ошибку:

Left "Failed reading: Cannot decode byte '\\xf2': Data.Text.Encoding.decodeUtf8: Invalid UTF-8 stream"

Это символ для ò, что имеет немного больше смысла.


person Tetigi    schedule 27.12.2014    source источник
comment
Вы действительно используете aeson-0.6.1.0? При этом похоже, что это какая-то плохая кодировка между Text и ByteString. Вы пытались вместо этого закодировать текст с помощью encodeUtf8 :: Text -> ByteString (из Data.Text.Encoding)?   -  person Zeta    schedule 27.12.2014
comment
@Zeta Я только что связал вкладку, которую я открыл в то время - установленная версия 0.7.0.4. Я попробую!   -  person Tetigi    schedule 27.12.2014
comment
@Zeta Это сработало! Теперь я получаю Right (Object fromList [("foo",String "b\242r")]) :)   -  person Tetigi    schedule 27.12.2014


Ответы (1)