3

簡単に言うと、私のコードはaesonを使用して json ファイルを解析することです

ここに私の2つのコードがあります:

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"

私のjsonテストファイル

そしてテスト手順:

  1. コードを保存し、a.hs (または任意の名前) という名前を付けます。
  2. テスト データを保存し、a.json という名前を付けます (名前は変更しないでください)。
  3. インストールしていない場合はaeson$ cabal install aseon
  4. $ ghc a.hs -o a
  5. $ ./a

出力から得られるのは「失敗」です。

そして、コマンド$ runghc a.hsを数回実行すると、いくつかokといくつかfailが混ざり合っていました。

Linux と 64 ビット Mac ghc でもこのコードを試してみましたが、すべてok期待どおりに出力されました。

私の友人の 1 人も、彼の 32 ビット mac ghc でこのコードを試しましたfail。そして、彼は私のコードに黒魔術をかけて、1行を次のように変更したと私に言いました

 let x = decode $(C.pack. C.unpack) au :: Maybe AuctionInfo

出力はokです。しかし、同じ黒魔術を行ったとき、出力はまだfail.

これが私のバグなのか、ghcのバグなのか、どうすればそれを判断できるのかを確認したいだけです。

4

1 に答える 1