Tôi đang cố gắng phân tích cú pháp dữ liệu JSON trong haskell. Đã trải qua một loạt các trang web, đây là điều xa nhất mà tôi có thể truy cập.phân tích cú pháp json trong haskell
data Address = Address { house :: Integer, street :: String, city :: String, state :: String, zip :: Integer } deriving (Show)
data Person = Person { name :: String, age :: Integer, address :: Address } deriving (Show)
getName :: Person -> String
getName (Person n _ _) = n
getAddress :: Person -> Address
getAddress (Person _ _ a) = a
getState :: Address -> String
getState (Address _ _ _ s _) = s
tôi viết rằng trong một tập tin ex.hs và tải nó trong ghci ->
Prelude> import Text.JSON
Prelude Text.JSON> :load ex
Main Text.JSON> let aa = "{\"name\": \"some body\", \"age\" : 23, \"address\" : {\"house\" : 285, \"street\" : \"7th Ave.\", \"city\" : \"New York\", \"state\" : \"New York\", \"zip\" : 10001}}"
...> decode aa :: Result JSValue
Nó trả
Ok (JSObject (JSONObject {fromJSObject = [("name",JSString (JSONString {fromJSString = "some body"})),("age",JSRational False (23 % 1)),("address",JSObject (JSONObject {fromJSObject = [("house",JSRational False (285 % 1)),("street",JSString (JSONString {fromJSString = "7th Ave."})),("city",JSString (JSONString {fromJSString = "New York"})),("state",JSString (JSONString {fromJSString = "New York"})),("zip",JSRational False (10001 % 1))]}))]}))
Không cần phải nói, có vẻ như khá dài dòng (và khủng khiếp). Tôi đã thử làm
...> decode aa :: Result Person
và nó đã cho tôi một lỗi. Làm thế nào để tôi đi về populating một thể hiện của cơ sở hạ tầng Person từ chuỗi json này? Ví dụ: tôi nên làm gì để nhận trạng thái của người trong chuỗi JSON ...
Có lẽ bạn cũng nên đưa ra một ví dụ về việc tạo một thể hiện của JSON vì bạn đã đề cập đến nó như một sự thay thế. – Wes
@Wes, Có bạn đi. – sabauma
Thông tin rất hữu ích. Tôi có một câu hỏi. Ngoài 'Text.JSON.Generic' (mà gói này đến từ đâu?), Tôi cũng đã tìm thấy https://hackage.haskell.org/package/generic-aeson tương tự sử dụng máy móc Generics để tạo các thể hiện JSON của Haskell dữ liệu. Sự khác nhau giữa hai gói này là gì? –