2016-08-14 7 views
0

次のJSON構造のタグを解析するのに問題があります。パーサーは、それがtags :: !Arrayであると宣言したときにのみ動作します。宣言すると失敗します。tags :: [Tag]Haskell Aeson入れ子配列JSON

なぜですか?

{ 
    "response": { 
    "status": "ok", 
    "results": [ 
     { 
     "type": "article", 
     "fields": { 
      "wordcount": "497" 
     }, 
     "tags": [ 
      { 
      "id": "profile/barryglendenning" 
      } 
     ] 
     } 
    ] 
    } 
} 



data Field = Field{ 
    wordcount :: Int 
} deriving (Show) 

instance FromJSON Field where 
    parseJSON (Object o) = Field <$> (o .: "wordcount") 
    parseJSON _ = mzero 


data Tag = Tag{ 
    id :: Text 
} deriving (Show) 

instance FromJSON Tag where 
    parseJSON (Object o) = Tag <$> (o .: "id") 
    parseJSON _ = mzero 

data SearchResult = SearchResult { 
    type:: Text, 
    field :: Field, 
    tags :: !Array 
} deriving (Show) 

instance FromJSON SearchResult where 
    parseJSON (Object o) = do 
     let t1 = o .: "type" 
     let t2 = o .: "fields" 
     let t3 = o .: "tags" 
     SearchResult <$> t1 <*> t2 <*> t3 
    parseJSON _ = mzero 


data ContentrResult = ContentrResult { 
    results :: [SearchResult], 
    status :: Text 
} deriving (Show) 

instance FromJSON ContentrResult where 
    parseJSON (Object o) = do 
     r <- o .: "response" 
     ContentrResult <$> r .: "results" 
         <*> r .: "status" 
    parseJSON _ = mzero 
+2

あなたが取得している正確なエラーとは何ですか? – user2847643

+0

おそらくあなたの問題とは関係ありませんが、私はレコードフィールドに 'id'という名前をつけません。なぜならあなたは前奏曲とあいまいであるからです。 –

+0

ところで、 'type'フィールドの名前は構文エラーです –

答えて

1

Nothingは、デバッグにはあまり役に立ちませんか?

tagsを解析するJSONの例を[Tag]として取得できました。あなたのエラーがwordcountフィールドに関連付けられている可能性がありますNumberではなくJSONのStringフィールドです。ここで

は、私は数に例JSONの語数を変更多かれ少なかれ自己完結型の例である:

{-# LANGUAGE OverloadedStrings #-} 
{-# LANGUAGE QuasiQuotes #-} 

module Main where 

import Lib (str) 

import Control.Monad (mzero) 
import Data.Aeson 
import qualified Data.ByteString.Lazy.Char8 as LBSC 
import Data.Text 

data Field = Field { 
    wordcount :: Int 
} deriving (Show) 

instance FromJSON Field where 
    parseJSON (Object o) = Field <$> o .: "wordcount" 
    parseJSON _ = mzero 

data Tag = Tag { 
    id :: Text 
} deriving (Show) 

instance FromJSON Tag where 
    parseJSON (Object o) = Tag <$> (o .: "id") 
    parseJSON _ = mzero 

data SearchResult = SearchResult { 
    typ :: Text, 
    fields :: Field, 
    tags :: [Tag] 
} deriving (Show) 

instance FromJSON SearchResult where 
    parseJSON (Object v) = SearchResult <$> v .: "type" <*> v .: "fields" <*> v .: "tags" 
    parseJSON _ = mzero 

data ContentrResult = ContentrResult { 
    results :: [SearchResult], 
    status :: Text 
} deriving (Show) 

instance FromJSON ContentrResult where 
    parseJSON (Object v) = ContentrResult <$> v.: "results" <*> v .: "status" 
    parseJSON _ = mzero 

data Response = Response { 
    response :: ContentrResult 
} deriving (Show) 

instance FromJSON Response where 
    parseJSON (Object v) = Response <$> v .: "response" 
    parseJSON _ = mzero 

responseJson :: String 
responseJson = [str| 
    { 
    "response": { 
     "status": "ok", 
     "results": [ 
     { 
      "type": "article", 
      "fields": { 
      "wordcount": 497 
      }, 
      "tags": [ 
      { 
       "id": "profile/barryglendenning" 
      } 
      ] 
     } 
     ] 
    } 
    } 
|] 

main :: IO() 
main = do 
    print r 
    putStrLn "" 
    where 
     r :: Maybe Response 
     r = decode (LBSC.pack responseJson) 
関連する問題