Clojure:解析json并提取值

时间:2019-03-28 20:32:25

标签: json clojure

我正在进行API调用,并使用Cheshire来解析JSON:

(defn fetch_headlines [source]
  (let [articlesUrl (str "https://newsapi.org/v2/top-headlines?sources=" 
                         source
                         "&apiKey=a688e6494c444902b1fc9cb93c61d6987")]
    (-> articlesUrl
        client/get
        generate-string 
        parse-string)))

JSON有效负载:

  

{“状态” 200,“标题” {“ access-control-allow-headers”“ x-api-key,   授权”,“内容类型”,“ application / json; charset = utf-8“,   “访问控制允许来源”“ *”,“内容长度”“ 7434”,   “连接”,“关闭”,“编译指示”,“无缓存”,“到期”,“-1”,   “ access-control-allow-methods”“ GET”,“ date”“ 2019年3月28日,星期四   20:22:16 GMT”,“ x-cached-result”,“ false”,“ cache-control”,“ no-cache”},   “身体”   “ {\” status \“:\” ok \“,\” totalResults \“:10,\” articles \“:[{\” source \“:{\” id \“:\” cnn \“,\ “ name \”:\“ CNN \”},\“ author \”:null,\“ title \”:\“ Trump:   穆勒的调查是政府的“试图接管”-CNN   视频\“ \”描述\“:\”在Fox News接受Sean Hannity采访时,   特朗普总统呼吁特别律师罗伯特·穆勒(Robert Mueller)的调查   \“”试图收购我们   政府。\\“ \”,\“ url \”:\“ http://us.cnn.com/videos/politics/2019/03/28/trump-mueller-probe-attempted-takeover-hannity-cpt-sot-vpx.cnn \”,\“ urlToImage \”:\“ https://cdn.cnn.com/cnnnext/dam/assets/190324191527-06-trump-mueller-reaction-0324-super-tease.jpg \”,\“ publishedAt \”:\“ 2019- 03-28T20:09:04.1891948Z \“,\” content \“:\”聊天   与我们在Facebook Messenger中。了解世界上正在发生的事情   因为它   展开。\“},{\”源\“:{\” id \“:\” cnn \“,\”名称\“:\” CNN \“},\”作者\“:空,\”标题\“:\“詹姆士   克拉珀回应称他应该接受调查-CNN   视频\“ \”描述\“:\”国家情报局前局长   詹姆斯·克拉珀(James Clapper)对白宫新闻秘书萨拉·桑德斯(Sarah Sanders)做出反应   说他和其他前情报官员应该   在特别律师罗伯特·穆勒(Robert Mueller)没有成立后进行调查   之间的串通   Tr…\“,\” url \“:\” http://us.cnn.com/videos/politics/2019/03/26/james-clapper-reponse-mueller-report-sarah-sanders-criticism-bts-ac360-vpx.cnn \“,\” urlToImage \“:\” https://cdn.cnn.com/cnnnext/dam/assets/190325211210-james-clapper-ac360-03252019-super-tease.jpg \“,\” publishedAt \“:\” 2019-03-28T20 :08:43.1736236Z \“,\”内容\“:\”聊天   与我们在Facebook Messenger中。了解世界上正在发生的事情   因为它   展开。\“},{\”源\“:{\” id \“:\” cnn \“,\”名称\“:\” CNN \“},\”作者\“:\”梅根   Vazquez,CNN \“,\” title \“:\”特朗普自穆勒以来首次集会   调查结束\“,\”描述\“:\”唐纳德·特朗普总统,   自罗伯特·穆勒(Robert Mueller)结束他的自   调查将在大瀑布城的一次集会上发表,   密歇根州星期四   晚上。\“,\” url \“:\” http://us.cnn.com/2019/03/28/politics/donald-trump-grand-rapids-rally/index.html \“,\” urlToImage \“:\” https://cdn.cnn.com/cnnnext/dam/assets/190321115403-07-donald-trump-lead-image-super-tease.jpg \“,\” publishedAt \“:\” 2019-03-28T19 :49:26Z \“,\”内容\“:\”华盛顿   (CNN)总统唐纳德·特朗普(Donald Trump)首次露面   自从罗伯特·穆勒(Robert Mueller)结束调查以来,他们的支持者将   周四在密歇根州大急流城的一次集会上发表讲话   晚上。\ r \ n这次集会是在华盛顿一个混乱的一周之后进行的,尤其是在…   [+2099   chars] \“},{\” source \“:{\” id \“:\” cnn \“,\”名称\“:\” CNN \“},\”作者\“:\”凯特琳   CNN的Polantz,“ \”标题\“:\”法官命令司法部移交法官   Comey memos \“,\” description \“:\”联邦法官已下令   在美国有线电视新闻网(CNN)和   其他媒体组织可以访问纪念文件   前联邦调查局局长与唐纳德总统的互动   Trump。\“,\” url \“:\” http://us.cnn.com/2019/03/28/politics/james-comey-memo-lawsuit/index.html \“,\” urlToImage \“:\” https://cdn.cnn.com/cnnnext/dam/assets/181209143047-comey-1207-super-tease.jpg \“,\” publishedAt \“:\” 2019-03-28T19 :14:45Z \“,\”内容\“:\”华盛顿   (CNN)一名联邦法官下令司法部和联邦调查局   在法院盖章的情况下,将詹姆斯·科米的备忘录完整地提交法院   CNN和其他媒体组织提起的访问   纪念前联邦调查局局长的文件…[+1043   chars] \“},{\” source \“:{\” id \“:\” cnn \“,\”名称\“:\” CNN \“},\”作者\“:\” Clare   Foran和Manu Raju,CNN \“,\”标题\“:\”佩洛西称AG对   穆勒报告“自大”,“描述”:“众议院议长南希”   佩洛西周四批评司法部长威廉·巴尔的摘要   律师罗伯特·穆勒(Robert Mueller)的报告   \\“居高临下\”和\\“傲慢\\”并说\\“不是   正确的事情   do。\\“ \”,\“ url \”:\“ http://us.cnn.com/2019/03/28/politics/pelosi-mueller-report-congress-barr-summary/index.html \”,\“ urlToImage \”:\“ https://cdn.cnn.com/cnnnext/dam/assets/190328130240-02-nancy-pelosi-03282019-super-tease.jpg \”,\“ publishedAt \”:\“ 2019- 03-28T18:48:25Z \“,\” content \“:null},{\” source \“:{\” id \“:\” cnn \“,\” name \“:\” CNN \“ },\“ author \”:\“分析   CNN总编辑Chris Cillizza撰写,“,”标题“:\” 43个最   唐纳德·特朗普对肖恩的电话采访中的离谱话   Hannity \“,\” description \“:\”没有该总裁的\“记者\”   唐纳德·特朗普比福克斯新闻的肖恩·汉尼提更喜欢-主要是由于   汉妮蒂(Hannity)对总统的坚定支持,就像小狗一样。王牌   喜欢奖励与他和睦相处的人,这使我们对   45分钟   ph…\“,\” url \“:\” http://us.cnn.com/2019/03/28/politics/sean-hannity-donald-trump-mueller/index.html \“,\” urlToImage \“:\” https://cdn.cnn.com/cnnnext/dam/assets/190328140149-01-hannity-trump-file-super-tease.jpg \“,\” publishedAt \“:\” 2019-03-28T18 :44:21Z \“,\” content \“:\”(CNN)   没有唐纳德·特朗普总统比福克斯更喜欢的“记者”   新闻的肖恩·汉妮蒂(Sean Hannity)-很大程度上是由于汉妮蒂坚定不移的小狗   狗对总统的支持。特朗普喜欢奖励那些   和他玩得很融洽,这使我们走了45分钟…[+14785   chars] \“},{\” source \“:{\” id \“:\” cnn \“,\”名称\“:\” CNN \“},\”作者\“:空,\”标题\“:\”波多黎各   Rico Gov .:我会把恶霸打在嘴里-CNN   视频”,“描述”:“”在接受CNN独家采访时,波多黎各   波多黎各州长里卡多·罗塞洛表示,他不会坐下来允许   他的官员被白人欺负   House。\“,\” url \“:\” http://us.cnn.com/videos/politics/2019/03/28/ricardo-rossello-trump-bully-puerto-rico-sot-vpx.cnn \“,\” urlToImage \“:\” https://cdn.cnn.com/cnnnext/dam/assets/190328123504-puerto-rico-gov-ricardo-rosello-super-tease.jpg \“,\” publishedAt \“:\” 2019-03-28T18 :08:33.7312458Z \“,\”内容\“:\”聊天   与我们在Facebook Messenger中。了解世界上正在发生的事情   因为它   展开。\“},{\”源\“:{\” id \“:\” cnn \“,\”名称\“:\” CNN \“},\”作者\“:\”杰里米   赫伯(Herb),马努·拉茹(Manu Raju)和泰德·巴雷特(Ted Barrett),CNN \“,\”标题\“:\”杰瑞德·库什纳(Jared Kushner)   参议院情报采访   委员会”,“说明”:“唐纳德·特朗普总统的女son   贾里德·库什纳(Jared Kushner)返回参议院情报委员会   作为委员会俄罗斯的一部分,星期四进行了闭门采访   调查。\“,\” url \“:\” http://us.cnn.com/2019/03/28/politics/jared-kushner-senate-intelligence/index.html \“,\” urlToImage \“:\” https://cdn.cnn.com/cnnnext/dam/assets/180302124221-30-jared-kushner-super-tease.jpg \“,\” publishedAt \“:\” 2019-03-28T16 :21:29Z \“,\” content \“:null},{\” source \“:{\” id \“:\” cnn \“,\” name \“:\” CNN \“},\ “作者\”:\“杰里米   赫伯(Cherb)和劳拉·贾瑞特(Laura Jarrett),CNN \“ \”标题\“:\”穆勒报道超过300   页面,消息来源说\“,\”描述\“:\”特别顾问罗伯特   穆勒(Mueller)关于俄罗斯调查的机密报告不仅限于   据司法部官员称,共有300页,第二页   有知识的来源   事项。\“,\” URL \“:\” http://us.cnn.com/2019/03/28/politics/mueller-report-pages/index.html \“,\” urlToImage \“:\” https://cdn.cnn.com/cnnnext/dam/assets/190324130054-05-russia-investigation-0324-super-tease.jpg \“,\” publishedAt \“:\” 2019-03-28T15 :52:01Z \“,\” content \“:null},{\” source \“:{\” id \“:\” cnn \“,\” name \“:\” CNN \“},\ “作者\”:\“吉姆   Acosta和Kevin Liptak,CNN \“,\” title \“:\”独家:波多黎各   州长警告白宫关于资金紧张的描述   在唐纳德·特朗普总统和波多黎各总统之间升级   救灾工作进展缓慢的州长   飓风过后仍受重创的岛屿   Maria。\“,\” url \“:\” http://us.cnn.com/2019/03/28/politics/ricardo-rossell-donald-trump-puerto-rico-funding/index.html \“,\” urlToImage \“:\” https://cdn.cnn.com/cnnnext/dam/assets/180920230539-pr-storm-of-controversy-rossello-trump-super-tease.jpg \“,\” publishedAt \“:\” 2019-03-28T15 :19:39Z \“,\”内容\“:null}]}”,   “跟踪重定向”   [“ https://newsapi.org/v2/top-headlines?sources=cnn&apiKey=a688e6494c444902b1fc9cb93c61d687”]

我想提取以从返回的JSON有效负载中提取URL,我已经尝试过:

(defn fetch_headlines [source]
  (let [articlesUrl (str "https://newsapi.org/v2/top-headlines?sources="
                         source
                         "&apiKey=a688e6494c444902b1fc9cb93c61d697")]
    (-> articlesUrl
        client/get
        generate-string 
        parse-string
        (get-in ["source" "url"]))))

但是我得到nil的结果,有什么想法吗?

基于用户反馈的解决方案:

(defn fetch-headlines [source]
  (let [articlesUrl (str "https://newsapi.org/v2/top-headlines?sources=" 
                         source
                         "&apiKey=a688e6494c444902b1fc9cb93c61d697")]
    (-> articlesUrl
        client/get
        :body
        parse-string
        (get-in ["articles" 0 "url"]))))

1 个答案:

答案 0 :(得分:1)

您需要的是body键内部,但是与该键对应的值仍然是字符串,而不是clojure映射。当您寻找source时,您将得到nil,因为该密钥不存在(在将字符串正确解析为json后,它应该位于body内)。

一旦您正确解析了body值,它应该类似于:

(let [index-of-article 0]
  (get-in response ["body" "articles" index-of-article "url"]))

其中index-of-article是您想要的文章的位置索引,因为文章包含文章的向量。