2017-11-27 7 views
3

json을 아래 형식으로 변환하고 싶습니다. 그리고 아래 형식을 내 기록으로 변환하십시오. 아래에 작성한 코드를 확인하십시오.aeson에서 사용자 정의 json 문자열로 레코드의 생성자 변환 haskell

{ 
    "uid" : "bob", 
    "emailid" : "[email protected]", 
    "email_verified" : "Y" // "Y" for EmailVerified and "N" for EmailNotVerified 
} 

나는, 내가 하스켈

그러나
{-# LANGUAGE OverloadedStrings #-} 
{-# LANGUAGE DeriveGeneriC#-} 

import Data.Monoid ((<>)) 
import GHC.Generics 
import Data.Aeson (FromJSON, ToJSON) 
import Data.Aeson.Types 

data User = User { 
    userId :: String, 
    userEmail :: String, 
    userEmailVerified :: EmailState 
    } deriving (Show, Generic) 

data EmailState = EmailVerified | EmailNotVerified deriving (Generic, Show) 

instance ToJSON User where 
    toJSON u = object [ 
     "uid" .= userId u, 
     "emailid" .= userEmail u, 
     "email_verified" .= userEmailVerified u 
     ] 

instance FromJSON User where 
    parseJSON = withObject "User" $ \v -> User 
     <$> v .: "uid" 
     <*> v .: "emailid" 
     <*> v .: "email_verified" 

instance ToJSON EmailState 
instance FromJSON EmailState 

에 아이손 라이브러리를 사용하여 JSON을 에서 사용자 유형을 변환하려고 코드 아래 나는 아래처럼 생성 현재 수 있어요 내 형식이

{ 
    "uid" : "bob", 
    "emailid" : "[email protected]", 
    "email_verified" : "EmailVerified" 
} 
+0

또한'EmailState' – 4e6

답변

4

당신은 그래서 instance ToJSON EmailState를 제거 EmailState 자신 (의 ToJSON를 구현해야하고, 가) 좋아 쓰기 :

instance ToJSON EmailState where 
    toJSON EmailVerified = String "Y" 
    toJSON EmailNotVerified = String "N"

또한 yhe 파서를 변경해야합니다

instance FromJSON EmailState where 
    parseJSON (String "Y") = return EmailVerified 
    parseJSON (String "N") = return EmailNotVerified 
    parseJSON _ = fail "Invalid JSON value to parse"
+0

감사 빌렘 위해/FromJSON' 인스턴스에'구현해야합니다. 당신의 솔루션은 효과가 있습니다. 가능한 경우 답변을 업데이트하거나 좋은 리소스를 가리켜 서 나처럼 하이스 켈에 대한 새로운 사람들이 해킹 문서를 이해할 수 있도록하십시오. 위의 경우와 마찬가지로 시도했습니다. 인스턴스 ToJSON EmailState toJSON _ = "Y"는 분명히 작동하지 않았습니다. – navin