2011-08-05 118 views
5

我正在處理簡單的Haskell程序,該程序從服務器獲取JSON字符串,對其進行解析並對數據執行某些操作。具體細節暫時並不相關,我遇到的麻煩是解析返回的JSON。解析Haskell中的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因爲這是似乎是建議,但我會更願意使用其他庫的更多。

此外,任何和所有這些代碼可以更改。如果獲得

+0

這會幫助你更具體地瞭解阻礙你的東西。它是從IO monad中獲取字符串嗎?或者它是解析的機制? (如果是後者,請查看RWH - 有關於解析JSON的全部章節。)FWIW,長期學習ByteString庫是值得的。 Haskell字符串非常緩慢。 – rtperson

+0

@rtperson。字符串不會自動緩慢解析。由於字符串是Char的列表,它們自然而有效地支持頭部解構 - 這正是解析需要的。當然,Char列表是關於內存使用的一般文本的不好表示。 –

+0

@rtperson它本質上都是。我是Haskell的新手,所以當我用其他幾種語言完成JSON解析時,Haskell的具體細節已經接近我。 –

回答

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實例它來處理轉換整齊。

+0

這就像一個魅力。謝謝。我沒有看到任何我不得不attoparsec :) –

+0

另外我試圖得到一個ByteString,但也掙扎着:P –