2012-05-15 14 views
11

मैं कुछ JSON को रिकॉर्ड प्रकार में पार्स करने के लिए डेटा का उपयोग कर रहा हूं। समय-समय पर डेटा JSON में जोड़ा जाता है और यह मेरा कोड टूट जाता है Aeson के प्रभाव से कुछ शिकायत के रूप में:दोष सहिष्णु JSON पार्सिंग

की उम्मीद 21 नाम/मान युग्म के साथ वस्तु लेकिन मिला 23 नाम/मान

मैं वास्तव में जेएसओएन को एक गलती सहनशील तरीके से पार्स करना पसंद करूंगा - मुझे कोई परवाह नहीं है कि बाद में जेएसओएन में अधिक फ़ील्ड जोड़े गए हैं, बस जो कुछ भी कर सकते हैं उसे पार्स करें! क्या इस गलती सहनशीलता को हासिल करने का कोई तरीका है?

myRecordFromJSONString :: BS.ByteString -> Maybe MyRecord 
myRecordFromJSONString s = case Data.Attoparsec.parse json s of 
    Done _rest res -> Data.Aeson.Types.parseMaybe parseJSON res 
    _    -> Nothing 

मैं जोड़ने चाहिए कि मैं Data.Aeson.TH से deriveJSON उपयोग कर रहा हूँ पार्स कोड उत्पन्न करने के लिए: यहाँ मेरी कोड है। अगर मैं मैन्युअल रूप से FromJSON कोड लिखता हूं तो यह गलती सहनशील है लेकिन मुझे ऐसा नहीं करना है ...

उत्तर

6

यदि आप जीएचसी 7.2 या 7.4 का उपयोग कर रहे हैं, तो aeson में नए जेनेरिक समर्थन अतिरिक्त फ़ील्ड की जांच नहीं करते हैं । मुझे यकीन नहीं है कि यह डिजाइन द्वारा है या नहीं, लेकिन हम इसे उसी कारण से उपयोग करते हैं।

{-# LANGUAGE DeriveGeneriC#-} 
{-# LANGUAGE OverloadedStrings #-} 

import Data.Aeson 
import qualified Data.Aeson.Types 
import Data.Attoparsec 
import qualified Data.ByteString as BS 
import Data.ByteString.Char8() 
import GHC.Generics 

data MyRecord = MyRecord 
    { field1 :: Int 
    } deriving (Generic, Show) 

instance FromJSON MyRecord 

myRecordFromJSONString :: BS.ByteString -> Maybe MyRecord 
myRecordFromJSONString s = case Data.Attoparsec.parse json s of 
    Done _rest res -> Data.Aeson.Types.parseMaybe parseJSON res 
    _    -> Nothing 

main :: IO() 
main = do 
    let parsed = myRecordFromJSONString "{ \"field1\": 1, \"field2\": 2 }" 
    print parsed 

इसे चलाने से 'फ़ील्ड 2' रिकॉर्ड में मौजूद नहीं होने के कारण TH व्युत्पन्न उदाहरण के साथ विफल हो जाएगा। Generic उदाहरण वांछित परिणाम देता है:

Just (MyRecord {field1 = 1}) 
संबंधित मुद्दे