5

私は複雑なネストされたjsonを持っています.AesonとAttoparsecでカスタムタイプに解析しようとしています。質問からの情報に基づく: Haskell, Aeson & JSON parsing into custom type , Aeson: How to convert Value into custom type? そしてインターネットからのいくつかの情報。

次のコードを使用している場合、オーバーラップした FromJSON インスタンスから "Nothing" 値を取得していますが、コードは確実に各インスタンスを通過します。他のインスタンスを無効にしてこれをテストしました。では、主な質問: インスタンスでコードをテストし、GHCi での実行中にデータがどのように変化するかを確認するにはどうすればよいでしょうか?

PS: ブレークポイントと「トレース」を設定しようとしましたが、main & parseCfg 関数でのみ機能します。

{-# LANGUAGE OverloadedStrings, FlexibleInstances #-}

-- high level data
data Cfg = Cfg { nm  :: CProperty,
             author :: CProperty,
             langs :: CValue,
             grops :: CListArr,
             projs :: CPropArr
           } deriving (Show)

...

instance FromJSON CProperty where
parseJSON _          = mzero
parseJSON (Object o) = CProperty <$> toCProperty o
  where
    toCProperty :: (HM.HashMap T.Text Value) -> J.Parser (T.Text, T.Text)
    toCProperty _  = error "unexpected property"
    toCProperty o' = do
      l <- return $ HM.toList o'
      k <- return $ fst $ head l
      v <- return $ snd $ head l
      v' <- parseJSON v
      return $ (k, v')

... lot's of different instances

-- |this instance is specific for different files
-- based on common functions to work with most of nested json code
instance FromJSON Cfg where
  parseJSON _          = mzero
  parseJSON (Object o) = do
    nm     <- (parseJSON :: Value -> J.Parser CProperty) =<< (o .: T.pack "Name")
    autor  <- (parseJSON :: Value -> J.Parser CValue)    =<< (o .: T.pack "Author")
    langs  <- (parseJSON :: Value -> J.Parser CProperty) =<< (o .: T.pack "Languages")
    groups <- (parseJSON :: Value -> J.Parser CListArr)  =<< (o .: T.pack "Groups")
    projs  <- (parseJSON :: Value -> J.Parser CPropArr)  =<< (o .: T.pack "Projects")
    return $ Cfg nm author langs groups projs
------------------------------------------------------------------------------------

main :: IO ()
main = do:
  s <- L.readFile "/home/config.json"
  -- print $ show s
  let cfg =  parseCfg s
  print $ show $ cfg

parseCfg :: L.ByteString -> Maybe Cfg
parseCfg s = decode s
4

1 に答える 1

3

明らかな問題は、

instance FromJSON CProperty where
    parseJSON _          = mzero
    parseJSON (Object o) = ...

最初の句はすべての入力に一致するため、インスタンスはmzero引数が何であれ返します。句の順序を変更する必要があります。

警告付きでコンパイルすると、GHC は重複するパターンを通知します。

于 2012-09-13T13:07:42.543 に答える