2011-10-06 41 views
9

Tôi đang cố gắng để phân tích một cuộc gọi đến một API vào loại hồ sơ Haskell sử dụng Thư viện Aesonphân tích jsons phức tạp với Aeson

Tôi đang sử dụng trang wikipedia, và phân tích chúng để tiêu đề và một danh sách liên kết . Một mẫu sẽ này,

{"query":{"pages":{"6278041":{"pageid":6278041,"ns":0,"title":"Lass","links":[{"ns":0,"title":"Acronym"},{"ns":0,"title":"Dead Like Me"},{"ns":0,"title":"Donna Lass"},{"ns":0,"title":"George Lass"},{"ns":0,"title":"Girl"},{"ns":0,"title":"Lassana Diarra"},{"ns":0,"title":"Lightning Lass"},{"ns":0,"title":"Real Madrid"},{"ns":0,"title":"Shadow Lass"},{"ns":0,"title":"Solway Lass"},{"ns":0,"title":"Szymon Lass"},{"ns":0,"title":"The Bonnie Lass o' Fyvie"},{"ns":0,"title":"The Tullaghmurray Lass"},{"ns":0,"title":"Woman"},{"ns":12,"title":"Help:Disambiguation"}]}}}} 

và tôi muốn phân tích nó để tiêu đề và một danh sách các liên kết trong một kiểu dữ liệu như thế này.

data WikiPage = WikiPage { title :: String, 
          links :: String } 

đang Những gì tôi đang có là thế này,

instance FromJSON WikiPage where 
    parseJSON j = do 
    o <- parseJSON j 
    let id = head $ o .: "query" .: "pages" 
    let name = o .: "query" .: "pages" .: id .: "title" 
    let links = mapM (.: "title") (o .: "query".: "pages" .: id .: "links") 
    return $ WikiPage name links 

Tôi nhận được thông báo lỗi,

Couldn't match expected type `Data.Text.Internal.Text' 
       with actual type `[Char]' 
    In the second argument of `(.:)', namely `"title"' 

tôi không thực sự có được whats going on, tôi cảm thấy như có phải là một vấn đề với cách tôi lập bản đồ qua các liên kết nhưng tôi không chắc chắn chính xác những gì đã được thực hiện. Tôi cũng không hiểu làm thế nào tôi phải sử dụng id trong chuỗi truy vấn thứ hai vì nó là một trình phân tích cú pháp (tôi chắc chắn tôi cần phải sử dụng ứng dụng ở đây một nơi nào đó nhưng tôi không chắc chắn như thế nào.) Tôi đã không tìm thấy bất kỳ ví dụ nào phân hủy các jsons phức tạp hơn như thế này.

+0

ngoài vấn đề về e'OverloadedStrings', những điều đó không có vẻ đúng, ví dụ: bạn nên thay thế 'let name =' by 'name <-', vì' name' hiện là kiểu 'Parser a' nhưng bạn muốn' a' – hvr

Trả lời

15

Tôi cũng đang cố gắng tìm ra aeson. Tôi đã có cùng một vấn đề bạn đang gặp phải và tôi đã giải quyết vấn đề bằng cách thêm {-# LANGUAGE OverloadedStrings #-} ở đầu tệp nguồn của tôi. Tôi rất mới để Haskell, nhưng tôi tin rằng nó thêm một phần mở rộng không chính thức cho ngôn ngữ, có lẽ để cho phép các chuỗi tăng gấp đôi như các kiểu dữ liệu kiểu chuỗi khác.

+5

Đúng vậy. Bạn cũng có thể sử dụng 'Data.Text.pack' để tự chuyển đổi một' Chuỗi' thành 'Văn bản'. – hammar

+0

Có cùng một vấn đề (với một thư viện khác, Campfire) và 'gói' được giải quyết cho tôi. –

Các vấn đề liên quan