2013-08-23 5 views
10

शामिल हैं, मैं निम्नलिखित JSON को एसन के साथ पार्स करने का प्रयास कर रहा हूं।फ़ील्ड नामों के साथ पार्स JSON जिसमें आरक्षित कीवर्ड

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

चूंकि मैं ध्यान नहीं देना चाहते क्षेत्र का एक बहुत हैं, यह I should use GHC generics लगता है। लेकिन डेटा प्रकार परिभाषा कैसे लिखें जो data और type जैसे हास्केल कीवर्ड का उपयोग करती है? निश्चित रूप से निम्नलिखित देता है: 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

आप GHC.Generics पर निर्भर बिना अपने स्वयं के FromJSON और ToJSON उदाहरणों लिख सकते हैं। इसका अर्थ यह भी है कि आप डेटा प्रतिनिधित्व और JSON प्रतिनिधित्व के लिए विभिन्न फ़ील्ड नामों का उपयोग कर सकते हैं।

पोस्ट के लिए उदाहरण उदाहरणों:

{-# 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.TH से भी कर सकते हैं, जो फ़ील्ड नामों को संशोधित करने के लिए एक फ़ंक्शन लेता है क्योंकि यह पहला तर्क है।

+0

धन्यवाद, अच्छी तरह से काम करता है! क्या इस दृष्टिकोण को 'सामान्य' के साथ जोड़ना भी संभव होगा? कहें, 'पोस्ट' प्रकार में' टाइप' विशेषता नहीं थी, ऐसा लगता है कि 'फीड' के' पार्सजॉन 'को मैन्युअल रूप से कार्यान्वित करते समय मुझे' पोस्ट व्युत्पन्न (जेनेरिक) 'नहीं हो सकता है और फिर उन्हें प्रश्न के रूप में संयोजित करें । – mb21

+0

अंत में, मैं सोच रहा था कि जेएसओएन में 'डेटा' विशेषता से छुटकारा पाने के लिए मुझे वास्तव में 'फीड' डेटा प्रकार की आवश्यकता है या क्या मैं किसी भी तरह सीधे पोस्ट पर जा सकता हूं। – mb21

+1

@ mb21 [ए] से जेएसओएन/टोजसन उदाहरण हैं, इसलिए यदि आप जो कुछ करना चाहते हैं वह पदों की एक सूची क्रमबद्ध है, तो इसे सीधे 'एनकोड सूचीऑफपोस्ट' के साथ करें। और आप जेनेरिक के साथ दृष्टिकोण को जोड़ सकते हैं, जेनेरिक का उपयोग करके किसी भी अन्य इंस्टेंस की तरह पोस्ट के लिए उदाहरण प्राप्त करें, और मैन्युअल रूप से फ़ीड के लिए उदाहरण लिखें। यह सिर्फ काम करता है। – bennofs

संबंधित मुद्दे