2013-04-11 25 views
2

我使用这个代码:'无' 结果从解码中埃宋

{-# LANGUAGE OverloadedStrings #-} 

import Data.Aeson 
import Data.Maybe 
import Data.ByteString.Lazy 
import Control.Applicative 
import Debug.Trace 
import Control.Monad 
import qualified Data.Aeson.Types as T 

main = do 
    res <- liftA show (liftA decodeOriginal (Data.ByteString.Lazy.readFile "./a.json")) 
    Prelude.putStrLn res 

interpretResult :: Maybe String -> String 
interpretResult Nothing = "Error." 
interpretResult x = fromJust x 

data TotalLine1 = TotalLine1 { 
    timestamp :: Integer, 
    value :: Integer 
} deriving (Eq, Show) 

data Original = Original { 
    totals :: [TotalLine1] 
} deriving (Eq, Show) 

instance FromJSON Original where 
    parseJSON (Object v) = traceStack "Original" (Original <$> (parseJSON =<< (v .: "visitors.total"))) 
    parseJSON _ = mzero 

instance FromJSON TotalLine1 where 
    parseJSON (Object v) = TotalLine1 <$> 
         v .: "timestamp" <*> 
         v .: "value" 
decodeOriginal :: ByteString -> Maybe Original 
decodeOriginal b = traceStack "decoding" (do 
    a <- decode b :: Maybe Original 
    return a) 

,试图解析JSON这样的:

{ 
visitors.total: [ 
{ 
timestamp: 1365548400, 
value: 1 
}, 
{ 
timestamp: 1365548700, 
value: 2 
}, 
{ 
timestamp: 1365549000, 
value: 5 
}, 
] 
} 

但主要只是每次都返回Nothing。我做错了什么?看来,即使parseJSON不被称为原始。

回答

5

您的JSON文件无效。

,一方面,该字段的名称已经被引用,

"timestamp" 

等而另一方面,你在TotalLine1是清单,这将导致的解码尾随的逗号ByteStringValue失败。引用字段名称并删除尾随逗号,它可以工作。

+0

总台。谢谢。 –