2011-08-05 13 views
5

私はサーバーからJSON文字列を取り出し、解析し、データで何かをする単純なHaskellプログラムに取り組んでいます。具体的な内容は現時点では適切ではありませんが、私が抱えている問題は返された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モナドから文字列を取り出していますか?それとも、構文解析の仕組みですか? (後者の場合は、RWHをチェックしてください - JSONの解析に関する全章があります)FWIW、ByteStringライブラリを学ぶのは長期的な価値があります。ハスケルの文字列は非常に遅いです。 – rtperson

+0

@rtperson。文字列は解析に自動的には遅くはありません。文字列はCharのリストなので、頭の中で自然と効率的に破壊をサポートします。これはまさに解析に必要なものです。もちろん、Charのリストは、メモリ使用に関する一般的なテキストの表現が貧弱です。 –

+0

@rtpersonそれは本質的に両方です。私はハスケルには新しく、他のいくつかの言語でJSON構文解析を行っていますが、Haskellの仕様は私には分かります。 –

答えて

9

Data.Aesonは、Attoparsecで使用するように設計されているため、ParserというAttoparsecで使用する必要があります。また、AttoparsecはByteStringで作業することを好むので、Stringの代わりにByteStringの結果を得るには、要求がわずかに変更されなければなりません。

これは動作するようです:

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)) 
ここ

私は単なるValueとしてJSONを解析されてきましたが、あなたはおそらく、独自のデータ型を作成し、それを処理するためにためFromJSONインスタンスを書きたいですよ変換はきちんとしています。

+0

これは魅力のように機能します。ありがとうございました。私はattoparsecにはどこにも見当たりませんでした:) –

+0

また、私はByteStringを取得しようとしていましたが、それも苦労していました。 –