Я пытаюсь использовать 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"
Это символ для ò, что имеет немного больше смысла.
Text
иByteString
. Вы пытались вместо этого закодировать текст с помощьюencodeUtf8 :: Text -> ByteString
(изData.Text.Encoding
)? - person Zeta   schedule 27.12.2014Right (Object fromList [("foo",String "b\242r")])
:) - person Tetigi   schedule 27.12.2014