ईसन का उपयोग करके कुछ सरल 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 उत्तर
यदि आप पहले से ही उस प्रकार के बारे में जानते हैं जो इरादा के अनुसार पार्स करता है तो शायद सबसे आसान समाधान उस प्रकार के संदर्भ में अपना उदाहरण लिखना और अनुवाद करना है:
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 )
संबंधित सवाल
नए सवाल
haskell
हास्केल एक कार्यात्मक प्रोग्रामिंग भाषा है जिसमें मजबूत स्थैतिक टाइपिंग, आलसी मूल्यांकन, व्यापक समानता और संक्षिप्तता समर्थन और अद्वितीय अमूर्त क्षमताओं की विशेषता है।