Намочив ноги строительным материалом и не имея возможности заставить Aeson работать должным образом, я решил, что мой новый проект строит парсер JSON. Очень абстрактно, так как это так или иначе, поэтому не имеет смысла размещать здесь весь код. Библиотека ByteString позволяет мне делать то, что мне нужно. Удалите символы, замените вещи, но: мне очень трудно восстановить это в точности так, как я разобрал. Data.Text, однако, кажется более подходящим для работы, но когда генерируется много шума с / "/, \ n и т. д. Каков был бы самый лучший и самый быстрый способ очистить файл от всего мусора и восстановить оставшиеся части до полезного текста? Очень маленькая часть внизу. Замечания по коду приветствуются. Учимся здесь.
import Network.HTTP.Simple
import GHC.Generics
import qualified Data.ByteString as B
import qualified Data.ByteString.Char8 as C
import Data.Text as T
import Data.Char
import Data.Text.Encoding as DTE
word8QuoteMark = fromIntegral (ord '"')
word8Newline = fromIntegral (ord '\n')
word8Backslash = fromIntegral (ord ':')
filterJson jsonData = B.filter (/= word8Backslash)
(B.filter (/= word8Newline)
(B.filter (/= word8QuoteMark) jsonData))
importJson :: IO ()
importJson = do
jsonData <- B.readFile "local.json"
output <- return (filterJson jsonData)
print $ (output)
Обратной стороной является то, что если кого-то называют, например. Франсуа, теперь он возвращается как Fran\195\167ois. Я думаю, что для этого в Data.Text мне потребуется гораздо больше шагов, но поправьте меня, если я ошибаюсь ...
Примечание: я видел в сообщении, что Даниэль Вагнер категорически не рекомендует использовать ByteString для текста, но просто в качестве аргумента.
Могу я его потом еще и закодировать?
@Chepner: ваш комментарий, кстати, квалифицирован как ответ мне, но я не думаю, что могу отметить комментарии как ответ

JSON по определению представляет собой строку Unicode, представляющую структуру данных. Однако от B.readFile вы получаете необработанную строку байтов, которую необходимо сначала декодировать, чтобы получить строку Unicode. Для этого вам нужно знать, в какой кодировке был создан файл. Предполагая, что файл использует кодировку UTF-8, вы можете сделать что-то вроде
import Data.Text
importJson :: String -> IO Text
importJson name = do
jsonData <- B.readFile name
return (Data.Text.Encoding.decodeUtf8 jsonData)
Когда у вас есть значение Text, вы можете проанализировать его в некоторой структуре данных в соответствии с грамматикой JSON.
Спасибо за это. Так что это не самый очаровательный способ синтаксического анализа JSON, который я придумал, но в итоге все еще заканчивается Data.Text, как Дэниел Вагнер написал в другом вопросе.
Данные, которые вы читаете из файла, еще не декодированы; сделайте это, прежде чем пытаться разобрать его. Этот «шум» - это как раз то, как отображается текст Unicode, а не то, что действительно существует в данных.