Haskell构建简单的JSON解析器

时间:2018-11-27 18:58:26

标签: json parsing haskell bytestring

全神贯注于构建东西,而无法让Aeson正常工作,我决定我的新项目正在构建JSON解析器。非常抽象,因为这是一种方法,因此将所有代码放在此处毫无意义。 ByteString库使我可以执行所需的操作。删除字符,替换内容,但是:我很难以完全分解的方式来重建它。然而,Data.Text似乎更适合该工作,但是当使用/“ /,\ n等产生大量噪声时,Data.Text似乎更合适。 从所有垃圾中清除文件并将其余部分恢复为有用文本的最佳,最快方法是什么?下面很小的一部分。欢迎在代码上注明。在这里学习。

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,现在返回为Fran\195\167ois。我想我需要在Data.Text中执行更多操作,但是如果我错了,请纠正我...

注意:我在一篇帖子中看到丹尼尔·瓦格纳(Daniel Wagner)强烈建议不要使用ByteString作为文本,但是只是为了争辩。

1 个答案:

答案 0 :(得分:0)

根据定义,

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