长话短说,我的代码是关于使用 aeson 解析 json文件
这是我的两段代码:
a.hs
{-# LANGUAGE OverloadedStrings #-}
import Data.Aeson
import qualified Data.ByteString.Lazy.Char8 as C
import Control.Monad
import Control.Applicative
data AuctionInfo = AuctionInfo {
realm :: Realm ,
alliance :: Auctions ,
horde :: Auctions ,
neutral :: Auctions
} deriving (Show )
instance FromJSON AuctionInfo where
parseJSON (Object o) = do
r <- o .: "realm" >>= parseJSON
a <- o .: "alliance" >>= parseJSON
h <- o .: "horde" >>= parseJSON
n <- o .: "neutral" >>= parseJSON
return $ AuctionInfo r a h n
parseJSON _ = mzero
data Realm = Realm { name2 :: String , slug:: String} deriving (Show )
instance FromJSON Realm where
parseJSON (Object o) = Realm <$>
o .: "name" <*>
o .: "slug"
parseJSON _ = mzero
data Auctions = Auctions {auctions :: [Auc]} deriving (Show)
instance FromJSON Auctions where
parseJSON (Object o ) = Auctions <$> o.: "auctions"
parseJSON _ = mzero
data Auc = Auc {
auc :: Integer,
itme :: Int,
owner :: String,
bid :: Integer,
buyout ::Integer,
quantity :: Int,
timeLeft :: String,
rand :: Integer,
seed :: Integer
} deriving (Show )
instance FromJSON Auc where
parseJSON (Object o ) = Auc <$>
o .: "auc" <*>
o .: "item" <*>
o .: "owner" <*>
o .: "bid" <*>
o .: "buyout" <*>
o .: "quantity" <*>
o .: "timeLeft" <*>
o .: "rand" <*>
o .: "seed"
parseJSON _ = mzero
main = do
au<- C.readFile "a.json"
let x = decode au :: Maybe AuctionInfo
case x of
Just a -> do
{-putStrLn.show $ a-}
putStrLn .show.length.auctions.alliance $ a
putStrLn "ok"
Nothing -> putStrLn "fail"
和测试步骤:
- 保存代码,并将其命名为 a.hs(或您想要的名称)
- 保存测试数据,命名为a.json(不要改名)
- 如果你还没有安装
aeson
,$ cabal install aseon
$ ghc a.hs -o a
$ ./a
我从输出中得到的是“失败”。
当我运行命令$ runghc a.hs
几次时,我什至把一些ok
和一些fail
混合在一起。
我还在我的 linux 和 64bit mac ghc 上尝试过这段代码,它们都ok
按我的预期输出。
我的一个朋友也在他的 32 位 mac ghc 上尝试过这个代码fail
。他告诉我他对我的代码施了一些黑魔法,把一行代码改成了
let x = decode $(C.pack. C.unpack) au :: Maybe AuctionInfo
那么输出是ok
. 但是当我做同样的黑魔法时,输出仍然是fail
.
我只是想确定这是我的错误还是 ghc 的错误,或者我该如何确定。