2011-08-05 33 views
5

Bir sunucudan JSON dizesini getiren, ayrıştıran ve verilerle bir şeyler yapan basit Haskell programı üzerinde çalışıyorum. Spesifikler şu an için gerçekten uygun değil, sorun şu ki geri dönen JSON ile ayrıştırmaktır.Haskell'de bir JSON dizgisini ayrıştırma

JSON dizesini sunucudan bir IO String türü olarak alıyorum ve bir JSON nesnesine nasıl ayrıştırılacağını anlayamıyorum.

Herhangi bir yardım çok takdir :)

İşte şimdiye kadar benim kodudur.

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) 

Not: önerilir gibi görünüyor ne gibi ben örnekte Data.Aeson kullanıyorum, ancak ben başka kitaplık kullanmak daha istekli olurdu. Ayrıca bu kodun herhangi biri ve hepsi değiştirilebilir.

+0

Geri planda tuttuğunuz konusunda daha spesifik olmanıza yardımcı olur. IO monadından ipi mi alıyor? Yoksa ayrışmanın mekaniği mi? (Eğer ikincisiyse, RWH'yi kontrol edin - JSON'u ayrıştırmak için ayrılmış bölümler vardır.) FWIW, ByteString kütüphanesini öğrenmek için uzun vadede size değecektir. Haskell Dizeleri çok yavaş. – rtperson

+0

@rtperson. Dizeler ayrıştırma için otomatik olarak yavaş değil. Dizeler Char'ın listeleri olduğu için, kafadaki yıkımı doğal ve verimli bir şekilde destekliyorlar - bu, ayrıştırma için gerekenler. Tabi ki, Char'ın listeleri bellek kullanımıyla ilgili genel metin için zayıf bir temsildir. –

+0

@rtperson Aslında ikisi de. Haskell'e yeni geldim, bu yüzden JSON'u diğer birkaç dilde ayrıştırırken, Haskell'in özellikleri bana ulaşıyor. –

cevap

9

Data.Aeson'u almak, Attoparsec ile kullanılmak üzere tasarlanmıştır, bu nedenle yalnızca size 0-verir ve sonra Attoparsec ile kullanmanız gerekir. Ayrıca, Attoparsec ByteString üzerinde çalışmayı tercih ediyor, bu nedenle String yerine ByteString sonucunu elde etmek için isteğin hafif bir şekilde değiştirilmesi gerekiyor.

Bu

iş gibi görünüyor:

İşte
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)) 

Sadece düz Value olarak JSON çözümlenen ettik, ama muhtemelen kendi veri tipini yaratmak ve işlemek için bir FromJSON örneğini yazmak isteyeceksiniz dönüşüm düzgünce.

+0

Bu bir çekicilik gibi çalışır. Teşekkür ederim. Attoparsec'e ihtiyacım olan herhangi bir yeri görmedim :) –

+0

Ayrıca bir ByteString çıkarıyordum ama bununla da uğraşıyordum: P –