Javascript: HTTP-запрос, как повторить ответ объекта JSON

Я запрашиваю конечную точку graphQL через http-запрос и получаю успешный ответ с данными, которые мне нужно собрать, однако я не могу перемещаться по данным, чтобы получить нужные мне поля.

 const query = JSON.stringify({query:
               '{' +
               '   all_insight_article('+
               '     locale: "en-gb"'+
               '     where: {business_unit: {business_unit: {title: "Some Brand"}, MATCH: ALL}, audience: {MATCH: ALL, audiences: {title: "Management"}}publish_date_gt: "2023-02-01"}'+
               '   ) {items {'+
               '     audienceConnection {'+
               '         edges {'+
               '           node {... on Audiences {title system {uid}}}}}'+
               '       system {'+
               '         uid'+
               '         publish_details {time}'+
               '         updated_at}'+
               '         absolute_url'+
               '         title'+
               '         subtitle'+
               '         main_image'+
               '         topicsConnection {'+
               '         edges {'+
               '           node {'+
               '             ... on Topics {'+
               '               title'+
               '               display_name'+
               '               system {uid}}}}}}total}}'
        });

var req = new HttpClientRequest("https://eu-graphql.contentstack.com/stacks/bltcxxx?environment=xxx&access_token=xxx")
req.header["Content-Type"] = "application/json"
req.method = "POST"
req.body = query
req.execute()
var response = req.response;
var posts = JSON.parse(response.body);
var articleList_json = [];

var i
for ( i = 0; i < 15; i++) {
  articleList_json.push({
    "title": posts[i].title,
  });
}

logInfo(articleList_json);

Ошибка, которую я получаю, это posts is undefined.

Примечание. HttpClientRequest — это класс для моего приложения, но в значительной степени это стандартный HTTP-запрос https://experienceleague.adobe.com/developer/campaign-api/api/c-HttpClientRequest.html

2-е обновление

Я пробовал следующее, но все еще не работает

var response = req.response;  
var posts = JSON.stringify(response.body);
var articleList_json = [];

var i
for ( i = 0; i < 15; i++) {
  var graphQLJSON = JSON.parse(posts[i]);
  articleList_json.push({
    "title": graphQLJSON.data.title,
  });
}

logInfo(articleList_json);

К вашему сведению: эту чудовищную строку можно упростить с помощью шаблонного литерала (строка с обратными кавычками)

Michael M. 22.02.2023 03:04

Кроме того, что именно вы хотите сделать? Вам нужно получить определенные поля или выполнить итерацию по многим полям? Если вам нужно перебирать, то по каким полям?

Michael M. 22.02.2023 03:05

Какие поля или каковы критерии?

Michael M. 22.02.2023 03:06

Спасибо, я обновил вопрос с новой структурой и сопоставлениями, у меня возникли проблемы даже с простым заголовком.

David Garcia 22.02.2023 03:33

Я попытался posts[i].data.all_insight_article.items.title вытащить заголовок, но ничего не вышло, по-прежнему возвращается undefined.

David Garcia 22.02.2023 04:04
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
5
63
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

JSON.parse() берет строку в структуре json и анализирует ее:

Статический метод JSON.parse() анализирует строку JSON, создавая значение JavaScript или объект, описанный строкой. Может быть предоставлена ​​необязательная функция восстановления для выполнения преобразования результирующего объекта перед его возвратом.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse

Пример строки JSON:

const json = '{"result":true, "count":42}';
const obj = JSON.parse(json);

HttpClientRequest возвращает объект HttpClientResponse, который вы должны сначала преобразовать в строку перед его разбором (при условии, что возвращаемая строка имеет допустимую структуру json):

var content = response.body.toString(response.codePage);
var posts = JSON.parse(content);

https://experienceleague.adobe.com/developer/campaign-api/api/p-HttpClientResponse-body.html

Пример полной документации:

var http = new HttpClientRequest("http://www.google.com/")
http.execute()
var response = http.response
if ( response.code != 200 )
  throw "HTTP request failed with " + response.message
var content = response.body.toString(response.codePage)

Как мне вытащить заголовок из JSON? posts[i].data.all_insight_article.items.title похоже не работает

David Garcia 22.02.2023 04:04

Честно говоря, я не уверен, так как я не совсем знаком с API и не вижу возвращаемых данных. Это может быть отдельный вопрос, который вы задаете с соответствующей информацией. Однако в ответ на этот конкретный вопрос проблема будет заключаться в том, как вы обрабатываете ответ, как описано в моем ответе. Надеюсь это поможет :)

limco 22.02.2023 04:10

спасибо, пример ответа здесь codebeautify.org/jsonviewer/y23e94b41 Буду тестировать дальше

David Garcia 22.02.2023 04:15

вы уверены, что массив находится в posts, а не в all_insight_article.items? т. е. следует ли вам обращаться к нему как all_insight_article.items[i] вместо posts[i]?

limco 22.02.2023 04:18

возможно, console.info объект posts и посмотреть, является ли он массивом. Если это не так, то posts[i] не сработает. console.info posts.data.all_insight_article.items[i] и обратите внимание, что... возможно, вы ищете posts.data.all_insight_article.items[i].title

limco 22.02.2023 04:20

На самом деле, глядя на пример ответа, похоже, что title на самом деле в posts.data.all_insight_article.items[0].title - «Шесть ключевых различий между частным капиталом и инвестициями на публичном рынке».

limco 22.02.2023 04:23
var response = JSON.stringify(req.response); var posts = JSON.parse(response.body); var articleList_json = []; var i; for ( i = 0; i < 15; i++) { articleList_json.push({ "title": posts.data.all_insight_article.items[i].title, }); }
David Garcia 22.02.2023 04:31

Я получаю 22/02/2023 03:30:38 js JST-310000 Error while compiling script 'WKF12/js' line 46: JSON.parse. что-то не так с синтаксическим анализом, я применяю это неправильно?

David Garcia 22.02.2023 04:32

Наконец-то заработало

var response = req.response;
var jsonData = JSON.parse(response.body)

    var articleList_json = [];
    var i;
    
    for (i = 0; (i < 15 && i < jsonData.data.all_insight_article.items.length); i++) {
      articleList_json.push({
        "title": jsonData.data.all_insight_article.items[i].title.toString()
      });
    }
    logInfo("Count "+i);
    
    logInfo(JSON.stringify(articleList_json));

консольный журнал массива объектов

[
  {
    "title": "Six key differences between private equity and public market investing"
  },
  {
    "title": "Securing the supply of rare earth metals is central to our energy transition"
  },
  {
    "title": "Test article for charts"
  },
  {
    "title": "Central banks hike rates again - but for how much longer?"
  }
]

Другие вопросы по теме