在 Haskell 中解析 JSON 字符串

6
我正在编写一个简单的Haskell程序,从服务器获取一个JSON字符串,解析它并使用数据进行某些操作。具体细节目前并不是很重要,我遇到的问题是如何解析返回的JSON。
我从服务器获得的JSON字符串类型为“IO String”,似乎无法弄清楚如何将其解析为JSON对象。
非常感谢您的任何帮助 :)
以下是我的代码:
import Data.Aeson
import Network.HTTP

main = do
    src <- openURL "http://www.reddit.com/user/chrissalij/about.json"
    -- Json parsing code goes here

openURL url = getResponseBody =<< simpleHTTP (getRequest url)

注意: 在示例中我使用的是Data.Aeson库,这似乎是推荐使用的库,但我也可以使用其他库。

此外,任何代码都可以更改。如果获取


你更具体地说明一下是什么阻碍了你会有所帮助。是从IO单子中获取字符串吗?还是解析机制?(如果是后者,请查看RWH - 有整章专门讲解解析JSON。)顺便说一句,长期来看学习ByteString库是值得的。Haskell字符串非常慢。 - rtperson
@rtperson。字符串在解析时不会自动变慢。由于字符串是字符列表,它们自然而有效地支持头部解构 - 这正是解析所需的。当然,对于一般文本来说,字符列表是内存使用方面的劣质表示。 - stephen tetley
@rtperson 实际上两者都是。我对 Haskell 还很新,所以虽然我在其他几种语言中做过 JSON 解析,但 Haskell 的细节让我有些困惑。 - Chris Salij
1个回答

9

Data.Aeson旨在与Attoparsec一起使用,因此它只提供给你一个Parser,您必须将其与Attoparsec一起使用。此外,Attoparsec更喜欢使用ByteString工作,因此您必须稍微改变请求的方式,以获得ByteString结果,而不是String

这似乎有效:

import Data.Aeson
import Data.Attoparsec
import Data.ByteString
import Data.Maybe
import Network.HTTP
import Network.URI

main = do
    src <- openURL "http://www.reddit.com/user/chrissalij/about.json"
    print $ parse json src

openURL :: String -> IO ByteString
openURL url = getResponseBody =<< simpleHTTP (mkRequest GET (fromJust $ parseURI url))

在这里,我只是将JSON解析为普通的Value,但您可能希望创建自己的数据类型并编写一个FromJSON实例来处理转换。


这个运行得非常好。谢谢。我没有看到任何地方需要使用attoparsec :) - Chris Salij
我也试图获取一个ByteString,但是也遇到了困难 :P - Chris Salij

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接