Как я могу прочитать массив во вложенном JSON, используя AESON

Я пишу приложение, использующее Github Webhooks API. В сообщении ловушки я получил эту структуру JSON: http://organicorange.ro:8000/set

Я делаю объявление типа следующим образом:

newtype CommitList = CommitList {commitList :: [Commit]}

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

data Commit = Commit {ids :: String, message :: String, url :: String, modified ::    [String], author :: Auth} deriving (Show)

instance FromJSON Commit where
    parseJSON (Object o) = Commit <$> o .: "id" <*> o .: "message" <*> o .: "url" <*> o .: "modified" <*> o .: "author"
    parseJSON _ = mzero

data Auth = Auth {name :: String, email :: String, username :: String} deriving (Show)

instance FromJSON Auth where
    parseJSON (Object o) = Auth <$> o .: "name" <*> o .: "email" <*> o .: "username"
    parseJSON _ = mzero

Как я могу проанализировать «модифицированный» массив, чтобы вернуть список?


person Deck Pope    schedule 29.08.2014    source источник
comment
Ваша реализация не работает? Я не включил раздел Auth в тест GHCi, но экземпляр FromJSON a => FromJSON [a] уже есть.   -  person bheklilr    schedule 29.08.2014
comment
Да, я скопировал/вставил ваш код и использовал предоставленный образец JSON, он отлично анализируется. В чем именно заключается ваш вопрос?   -  person bheklilr    schedule 29.08.2014
comment
Спасибо за ваше время. в этой конфигурации, когда я пытаюсь проанализировать измененный массив из JSON, я получаю [String], как я определил: [["src/FullBG/index.html","src/Main.hs","src/app.json"]], мне нужен список с такими компонентами, как ["src/FullBG/index.html","src/Main.hs","src/app.json"].   -  person Deck Pope    schedule 29.08.2014


Ответы (1)


Я действительно не уверен, что это то, о чем вы спрашиваете, но если вы спрашиваете, "как я могу, учитывая этот образец JSON, получить список всех измененных файлов", то это должно работать:

main = do
    -- get the JSON from the api
    json <- simpleHttp "http://organicorange.ro:8000/set"
    -- parse and pull out the commits into [Commit], if the parse fails then you will just have am empty list 
    let commits = maybe ([]) (commitList) (decode json :: Maybe CommitList)
    -- for each commit, pull out the modified files and then concatenate the results together 
    print $ concatMap (modified) commits
person jek    schedule 30.08.2014
comment
@DeckPope Нет проблем, в будущем google — отличный способ найти эти функции. Если это действительно ответило на ваш вопрос, вы можете пометить ответ как принятый, в качестве альтернативы, если вы считаете, что ваш вопрос остается без ответа, дайте мне знать. - person jek; 31.08.2014