2012-12-25 134 views
3

我想寫一個模塊,從api分析xml,去掉一些信息,並將結果打印爲json,但是我在打印步驟中遇到了一個呃逆。如果我打印節目,我確實看到正確的數據在那裏,但是,將記錄轉換成json,encode shows的調用會產生段錯誤。這段代碼爲什麼會產生段錯誤?

{-# LANGUAGE Arrows, NoMonomorphismRestriction, OverloadedStrings #-} 
import Network.HTTP 
import Text.XML.HXT.Core 
import Data.Aeson 
import qualified Data.ByteString.Lazy.Char8 as LazyByteString 

openUrl :: String -> IO String 
openUrl url = getResponseBody =<< simpleHTTP (getRequest url) 

composeSearch :: String -> String 
composeSearch query = "http://services.tvrage.com/feeds/search.php?show=" ++ urlEncode query 

searchShow :: String -> IO String 
searchShow query = openUrl $ composeSearch query 

data TvShow = TvShow { showName, showId :: String } deriving (Show) 

getShow = deep (isElem >>> hasName "show") >>> 
    proc x -> do 
     name <- getText <<< getChildren <<< deep (hasName "name") -< x 
     id <- getText <<< getChildren <<< deep (hasName "showid") -< x 
     returnA -< TvShow { showName = name, showId = id } 

instance ToJSON TvShow where 
    toJSON (TvShow name id) = object ["name" .= name, "id" .= id] 

main :: IO() 
main = do 
    results <- searchShow "Always Sunny" 
    shows <- runX (readString [ withValidate no ] results >>> getShow) 
    putStrLn (LazyByteString.unpack (encode shows)) 

編輯:作爲user1891025指出,這可能是與我的機器或包版本的問題。

  • 操作系統:Ubuntu 11.04 32位
  • 埃宋v0.6.1.0
  • GHC v7.2.1

這個問題越來越具體越來越多,所以我將它帶到體育館,但如果任何人有任何幫助,請讓我知道!

+1

它適合我。您可能想要發佈系統信息,軟件包版本和錯誤消息(如果存在)。 – user1891025

+0

我認爲你是對的。我已經嘗試過使用'encode'的發佈示例,但它也被隔離了。艾森(大概)似乎不喜歡我的機器。 :) –

+0

你使用什麼標誌來編譯代碼?可能是與例如芯片組上的LLVM後端。 –

回答

0

Aeson's encode函數調用encodeUtf8來自Data.Text包。該函數使用unsafeDupablePerformIO和其他不安全的函數在內存中查找。這可能是segfault發生的地方。

請參閱代碼here

相關問題