2013-08-23 3 views
10

나는 다음 JSON을 aeson으로 구문 분석하려고합니다. 내가 무시하고 싶은 분야가 많이 있기 때문에예약 키워드가 포함 된 필드 이름을 사용하여 JSON을 구문 분석합니다.

{ 
    "data": [ 
     { 
      "id": "34", 
      "type": "link", 
      "story": "foo" 
     }, 
     { 
      "id": "35", 
      "type": "link", 
      "story": "bar" 
     } 
    ] 
} 

, 그것은 I should use GHC generics을 보인다. 그러나 하스켈 키워드 인 datatype을 사용하는 데이터 유형 정의를 작성하는 방법은 무엇입니까? 물론 다음은 제공 : 당신은 GHC.Generics에 의존하지 않고 자신의 FromJSONToJSON 인스턴스를 작성할 수 있습니다 parse error on input `data'

data Feed = Feed {data :: [Post]} 
    deriving (Show, Generic) 

data Post = Post { 
     id :: String, 
     type :: String, 
     story :: String 
    } 
    deriving (Show, Generic) 

답변

13

. 이것은 또한 데이터 표현 W JSON 표현에 대해 다른 필드 이름을 사용할 수 있음을의 L합니다. 포스트

예 인스턴스 :

{-# LANGUAGE OverloadedStrings #-} 
import Control.Applicative 
import Data.Aeson 
import qualified Data.ByteString.Lazy as LBS 

data Post = Post { 
     postId :: String, 
     typ :: String, 
     story :: String 
    } 
    deriving (Show) 

instance FromJSON Post where 
    parseJSON (Object x) = Post <$> x .: "id" <*> x.: "type" <*> x .: "story" 
    parseJSON _ = fail "Expected an Object" 

instance ToJSON Post where 
    toJSON post = object 
    [ "id" .= postId post 
    , "type" .= typ post 
    , "story" .= story post 
    ] 

main :: IO() 
main = do 
    print $ (decode $ Post "{\"type\": \"myType\", \"story\": \"Really interresting story\", \"id\" : \"SomeId\"}" :: Maybe Post) 
    LBS.putStrLn $ encode $ Post "myId" "myType" "Some other story" 

동일 공급을 위해 수행 할 수 있습니다. 필드를 무시할 필요가 없다면 Data.Aeson.THderiveJSON을 사용할 수도 있습니다.이 함수는 필드 이름을 첫 번째 인수로 수정하는 기능을 사용합니다.

+0

감사합니다. 이 접근법을'Generic'과 결합하는 것도 가능합니까? 예를 들어,'Post' 타입은'type' 속성을 가지고 있지 않습니다.'Feed'의'parseJSON'을 수동으로 구현하는 동안'Post derived (Generic) '를 가질 수없고 질문과 같이 결합 할 수 없습니다. . – mb21

+0

마지막으로 JSON의'data' 속성을 없애기 위해'Feed' 데이터 유형이 정말로 필요한지 궁금 해서요. 아니면 직접 게시물에 직접 접근 할 수 있는지 궁금합니다. – mb21

+1

@ mb21 [a]에는 FromJSON/ToJSON 인스턴스가 있으므로, 게시물 목록을 직렬화하는 것이 전부라면 'encode listOfPosts'로 직접 수행하십시오. 또한이 접근법을 Generic과 결합하여 Generic을 사용하여 다른 인스턴스처럼 Post의 인스턴스를 파생시키고 Feed 인스턴스를 수동으로 작성할 수 있습니다. 그냥 작동합니다. – bennofs

관련 문제