Haskell создает простой парсер JSON

Намочив ноги строительным материалом и не имея возможности заставить 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 для текста, но просто в качестве аргумента.

Данные, которые вы читаете из файла, еще не декодированы; сделайте это, прежде чем пытаться разобрать его. Этот «шум» - это как раз то, как отображается текст Unicode, а не то, что действительно существует в данных.

chepner 27.11.2018 20:02

Могу я его потом еще и закодировать?

Madderote 27.11.2018 20:04

@Chepner: ваш комментарий, кстати, квалифицирован как ответ мне, но я не думаю, что могу отметить комментарии как ответ

Madderote 27.11.2018 20:05
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
0
3
311
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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, как Дэниел Вагнер написал в другом вопросе.

Madderote 28.11.2018 07:11

Другие вопросы по теме