2013-04-11 2 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 
}, 
] 
} 

그러나 주요 단지마다 아무 것도 반환하지 않습니다. 나는 무엇을 잘못 했는가? parseJSON이 Original에 대해서 호출되지 않고있는 것처럼 보입니다.

답변

5

JSON 파일이 유효하지 않습니다. 당신의 디코딩을 일으키는 TotalLine1의 목록에 콤마를

"timestamp" 

등 다른에

, 필드의 이름이 인용되어야하는 한편

, ByteString에서 Value으로 실패합니다. 필드 이름을 인용하고 후행 쉼표를 제거하면 작동합니다.

+0

헤드 데스크. 감사. –