Clojure: анализ json и извлечение значений - PullRequest
0 голосов
/ 28 марта 2019

Я делаю вызов 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:

{"status" 200, "headers" {"access-control-allow-headers" "x-api-key, авторизация "," тип контента "" application / json; кодировка = UTF-8" , "access-control-allow-origin" "*", "content-length" "7434", "connection" "close", "pragma" "no-cache", "expires" "-1", "access-control-allow-method" "GET", "date" "чт, 28 марта 2019 г. 20:22:16 GMT "," x-cached-result "" false "," cache-control "" no-cache "}, «Тело» "{\" Статус \ ": \" ОК \», \ "totalResults \": 10 \ "статьи \": [{\ "источник \": {\ "идентификатор \": \ "Cnn \", \ "имя \": \ "CNN \"}, \ "автор \": нулевой, \ "название \": \ "Trump: Зонд Мюллера был «попыткой захвата» правительства - CNN Видео \ ", \" description \ ": \" В интервью Fox News Шону Хэннити, Президент Трамп назвал зонд специального адвоката Роберта Мюллера \\ "попытка захвата нашего правительство. \\ "\", \ "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\":\"Chat с нами в Facebook Messenger. Узнайте, что происходит в мире как это разворачивает \ "}, {\". Источник \ ": {\" идентификатор \ ": \" Cnn \ "\ "Имя \": \ "CNN \"}, \ "автор \": нулевой, \" в заголовке \":\"Джеймс Клаппер реагирует на вызов, он должен быть исследован - CNN Видео \ ", \" описание \ ": \" Бывший директор национальной разведки Джеймс Клэппер реагирует на пресс-секретаря Белого дома Сару Сандерс говоря, что он и другие бывшие сотрудники разведки должны быть расследование после того, как специальный адвокат Роберт Мюллер не установил сговор между 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\",\"content\":\"Chat с нами в Facebook Messenger. Узнайте, что происходит в мире как это разворачивает \ "}, {\". Источник \ ": {\" идентификатор \ ": \" Cnn \ "\ "Имя \": \ "CNN \"}, \ "автор \": \" Maegan Васкес, CNN \ ", \" title \ ": \" Трамп готовится к первому ралли со времен Мюллера расследование закончено \ ", \" описанием \ ": \" президент Дональд Трамп, делая его первое появление перед сторонниками, так как Роберт Мюллер закончил свою расследование, собирается выступить во время митинга в Гранд-Рапидсе, Мичиган четверг ночь. \ ", \" 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\",\"content\":\"Washington (CNN) президент Дональд Трамп, делая его первое появление перед Сторонники, так как Роберт Мюллер закончил свое расследование, настроен на выступать во время митинга в Гранд-Рапидс, штат Мичиган, в четверг ночь. Ралли следует за хаотичной неделей в Вашингтоне, прежде чем… [+2099 символы] \ "}, {\" источник \ ": {\" идентификатор \ ": \" Cnn \ "\ "Имя \": \ "CNN \"}, \ "автор \": \" Katelyn Поланц, CNN \ ", \" title \ ": \" Судья приказывает Департаменту юстиции передать Comey памятки \ ", \" описание \ ": \" Федеральный судья приказал, чтобы Записки Джеймса Коми перевернуты в судебном деле, возбужденном CNN и другие средства массовой информации для доступа к документам увековечивания взаимодействие бывшего директора ФБР с президентом Дональдом Козырь. \ ", \" 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\",\"content\":\"Washington (CNN) федеральный судья приказал, чтобы Министерство юстиции и ФБР представить записки Джеймса Коми в полном объеме в суд под печатью, в суде дело, возбужденное CNN и другими организациями СМИ для доступа к документы, увековечивающие память бывшего ФБР… [+1043 символы] \ "}, {\" источник \ ": {\" идентификатор \ ": \" Cnn \ "\ "Имя \": \ "CNN \"}, \ "автор \": \" Clare Форан и Ману Раджу, CNN \ ", \" title \ ": \" Пелоси называет резюме А.Г. Доклад Мюллера "высокомерный" \ ", \" описание \ ": \" Дом спикера Нэнси Пелоси в четверг раскритиковал резюме генерального прокурора Уильяма Барра специального доклада Роберта Мюллера, называя его \\ "снисходительный \\" и \\ "высокомерный \\" и говоря \\ "это не было правильная вещь 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\":\"Analysis Крис Киллиза, главный редактор CNN \ ", \" title \ ": \" 43 самых возмутительные строки из телефонного интервью Дональда Трампа с Шоном Hannity \ ", \" description \ ": \" Там нет \\ "репортера \\" этого президента Дональду Трампу нравится больше, чем Шону Хэннити из Fox News - во многом благодаря HannНепоколебимая, как щенок, поддержка президента.Трамп любит вознаграждать людей, которые хорошо с ним играют, что приводит нас к 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)There's нет \ \ "репортера \", что президенту Дональду Трампу нравится больше, чем Шону Хэннити из Fox News - во многом из-за непоколебимой поддержки президента, подобной щенку, как Хэннити. Трамп любит вознаграждать людей, которые хорошо играютего, что приводит нас к 45-минутному… [+14785 символов] \ "}, {\" source \ ": {\" id \ ": \" cnn \ ", \" name \ ": \" CNN \"}, \" author \ ": null, \" title \ ": \" Пуэрто-Рико, губернатор. Я ударю хулигана в рот - CNN Video \ ", \" description \ ": \" В эксклюзивеВ интервью CNN губернатор Пуэрто-Рико Рикардо Росселло заявил, что не будет сидеть сложа руки и позволять издевательствам над Белым домом своих чиновников. \ ", \" 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\",\"content\":\"Chat с нами в Facebook Messenger.Узнайте, что происходит в мире, когда он разворачивается. \ "}, {\" Source \ ": {\" id \ ": \" cnn \ ", \" name \ ": \" CNN \ "}, \"автор \ ": \" Джереми Херб, Ману Раджу и Тед Барретт, CNN \ ", \" title \ ": \" Джаред Кушнер дал интервью сенатскому комитету по разведке \ ", \" description \ ": \" Сын президента Дональда Трампа -Священник Джаред Кушнер вернулся в сенатский комитет по разведке на собеседование за закрытыми дверями в четверг в рамках расследования комитета по России. \ ", \" 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\"},\"author\":\"Jeremy Херб и Лора Джарретт, CNN \ ", \" title \ ": \" Мюллер сообщает более 300 страниц, источники говорят \ ", \" description \ ": \" Специальный советник Роберт Мюллер конфиденциальноОтчет о российском расследовании составляет более 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\"},\"author\":\"Jim Акоста и Кевин Липтак, CNN \ ", \" title \ ": \" Эксклюзив: губернатор Пуэрто-Рико предупреждает Белый дом о финансировании \ ", \" description \ ": \" Напряженность между президентом Дональдом Трампом и губернатором Пуэрто-Рико обостряется из-за усилий по оказанию помощи в случае стихийных бедствий, которые не спешат приходить на все еще пострадавший остров после урагана "Мария". \ ", \" 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\",\"content\":null}]}"," trace-redirects "[" https://newsapi.org/v2/top-headlines?sources=cnn&apiKey=a688e6494c444902b1fc9cb93c61d687"]}

Я хочу извлечь, чтобы извлечь URL-адреса извозвращенная полезная нагрузка JSON, я пробовал это:

(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 Ответ

1 голос
/ 29 марта 2019

То, что вам нужно, находится внутри клавиши body, но значение, соответствующее этому ключу, все еще является строкой, а не картой замыкания.Когда вы ищете source, вы получаете nil обратно, потому что этот ключ не существует (он должен быть внутри body после правильного разбора строки в json).

Как только вы 'Если вы правильно проанализировали значение body, оно должно выглядеть примерно так:

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

, где index-of-article - это позиционный индекс статьи, которую вы хотите, поскольку статьи содержат вектор статей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...