Haskell 构建简单的 JSON 解析器

Haskell building simple JSON parser

我的脚弄湿了构建东西,并且无法让 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çois,它现在返回为 Fran57ois。我认为我需要更多步骤才能在 Data.Text 中执行此操作,但如果我错了请纠正我...

注意:我在 post 中看到 Daniel Wagner 强烈建议不要 ByteString 文本,但只是为了争论。

根据定义,

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 语法将其解析为某种数据结构。