ईसन का उपयोग करके कुछ सरल JSON को पार्स करने का प्रयास करते समय मुझे एक प्रकार की त्रुटि मिलती है जो मुझे समझ में नहीं आती है। मेरे पास निम्न JSON है:

jsonString = "[\"a\", [\"b\", \"c\"]]" :: L.ByteString

और मैंने निम्नलिखित आयात और कोड को परिभाषित किया है:

import Data.Aeson
import GHC.Generics
import qualified Data.ByteString.Lazy as L

data Ch = Ch {
   c1 :: String,
   c2 :: (String, String)
} deriving (Show, Generic)
instance FromJSON Ch

जब मैं अपने Ch प्रकार के साथ इस स्ट्रिंग पर eitherDecode का उपयोग करने का प्रयास करता हूं तो मुझे एक त्रुटि मिलती है

*Aeson> eitherDecode jsonString :: Either String Ch
Left "Error in $: expected record (:*:), encountered Array"

क्या कोई मुझे त्रुटि समझा सकता है और मुझे बता सकता है कि मुझे इस JSON को कैसे पार्स करना चाहिए?

एक दृष्टिकोण जो काम करेगा

eitherDecode jsonString :: Either String (String, (String, String))

लेकिन मैं सीधे अपने प्रकार पर जाना चाहूंगा।

1
Bob Jansen 8 पद 2018, 11:26

1 उत्तर

सबसे बढ़िया उत्तर

यदि आप पहले से ही उस प्रकार के बारे में जानते हैं जो इरादा के अनुसार पार्स करता है तो शायद सबसे आसान समाधान उस प्रकार के संदर्भ में अपना उदाहरण लिखना और अनुवाद करना है:

import Data.Aeson
import GHC.Generics
import qualified Data.ByteString.Lazy as L

data Ch = Ch {
   c1 :: String,
   c2 :: (String, String)
} deriving (Show, Generic)

instance FromJSON Ch where
    parseJSON x =
        do (a,(b,c)) <- parseJSON x
           pure (Ch a (b,c))

और परिणाम है:

*Main> :set -XOverloadedStrings
*Main> eitherDecode "[\"a\", [\"b\", \"c\"]]" :: Either String Ch
Right (Ch {c1 = "a", c2 = ("b","c")})

संपादित करें:

ईसन के एपीआई का अधिक प्रत्यक्ष उपयोग सूचनात्मक या पसंदीदा हो सकता है:

instance FromJSON Ch where
    parseJSON =
       withArray "Ch" $ \arr ->
       -- from Data.Aeson.Types
           if V.length arr /= 2
              -- ^ from Data.Vector
              then typeMismatch "Length should be 2" (Array arr)
                   -- ^ from Data.Aeson.Types
              else Ch <$> parseJSON (arr ! 0) <*> parseJSON ( arr ! 1 )        
1
Thomas M. DuBuisson 8 पद 2018, 11:54