全神贯注于构建东西,而无法让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
作为文本,但是只是为了争辩。
答案 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语法将其解析为某种数据结构。