Использование JSON, возвращенного через PHP, в Javascript

Итак, я делаю проект для колледжа, включающий API для информации о еде, он возвращает бренд еды, идентификатор, энергию, жир и т. д. Через JSON, он также возвращает много другой информации, которая мне не нужна, через JSON, поэтому Мне интересно, как я могу быть избирательным в том, что я возвращаю, а затем использую.

Я подключаюсь к API с помощью PHP, и это код, который я использую.

<?php
//$ingr = "ingr = " . $_GET['foodName'];
$ingr = "ingr=Bread";

//echo getFoodFromAPI($ingr);
getFoodFromAPI($ingr);

//return $decodedData;
function getFoodFromAPI($ingr){
    /*$queryParams = array(
        'Food' => $JsonFood
    );*/
    //echo $JsonFood;
    $api = "https://api.edamam.com/api/food-database/parser?";
    $apiId = "&app_id=ABC";
    $apiKey = "&app_key=ABC";
    $url = $api . $ingr . $apiId . $apiKey; //+ $search

    $JsonContents = file_get_contents($url);
    $Json = json_decode($JsonContents);

    //echo $JsonBrand."Hello There Brand";

    for ($x = 1; $x <= 10; $x++) {
        $JsonBrand = $Json->hints[$x]->{'food'}->{'brand'} . "<br>"; //used to echo the values of the decoded data
        $JsonLabel = $Json->hints[$x]->{'food'}->{'label'} . "<br>"; //used to echo the values of the decoded data
        echo $JsonBrand;
        echo $JsonLabel;
    } 

    $JsonRec = json_encode($Json);



    //print_r($JsonRec->hints->food);

    return $JsonRec;

};

?>

Итак, мой вопрос: есть ли способ вернуть только определенные части декодированного JSON? Мне не нужна / не нужна определенная информация (например: возвращать только марку и идентификатор еды), а также есть способ использовать возвращенные данные, являющиеся либо объектом PHP, либо массивом в javascript (т.е. показать его клиенту на веб-странице)

Пожалуйста, не стесняйтесь попросить меня прояснить все, что я не смог объяснить, например, я сказал, что учусь в колледже, поэтому я все еще изучаю и понимаю языки, когда использую их.

Также для справки вот HTML и JavaScript, с которыми я работал, и снова я не знаю, правильно ли это, потому что существует смесь между AJAX и JQuery.

function find_food(foodName) {
  var vars = "foodName" + foodName;
  var result = "";

  $.ajax({
    url: "sendFood.php",
    type: "GET",
    data: vars,
    async: false,
    success: function(data) {
      console.info(data + "Data Here !");
      result = data;
    }
  });
  return result;
  //console.info(result);
  //return result;
}

function searchFoodDic() {
  var food = document.getElementById("foodName").value;
  console.info(food);
  //var htmlText = "";
  document.getElementById("searchedFood").innerHTML = "processing...";
  var foodSearched = find_food(food);
  console.info('>>>> searched food: ', foodSearched);
  //htmlText += '<p class = "p-name"> Train Code: ' + foodSearched[1].brand + '</p>';
  //var filteredFood = getCommonFoods(foodSearched.food);
  //console.info('>>>> filtered food: ', filteredFood);
  htmlText = "Hello";

  for (i = 0; i < 5; i++) {
    //htmlText += '<p class = "p-foodName"> Food Name: ' + data.hints[i].food.brand + '</p>';
    htmlText += '<p class = "p-foodLabel1"> Food Label 1: ' + foodSearched.foodId + '</p>';
    htmlText += '<p class = "p-foodLabel2"> Food Label 2: ' + foodSearched.label + '</p>';
    htmlText += '<br/>';
  }

  document.getElementById("searchedFood").innerHTML = htmlText;
}
<link rel = "stylesheet" type = "text/css" href = "food.css">
<html>

<head>
  <ul>
    <li><a class = "active" href = "index.php">Home </a></li>
    <li><a href = "admin.html">Administration</a></li>
    <li><a href = "contact.html">Contact</a></li>
  </ul>
  <script src = "https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>


</head>
<title> Food Website </title>

<body>
  <script src = "searchFood.js" type = "text/javascript"></script>
  <div class = "food-container">
    <input type = "text" id = "foodName" name = "foodName" placeholder = "Enter food eg: Apple, Bread">
    <input type = "submit" onclick = "searchFoodDic()">
    <div id = "searchedFood">

    </div>
  </div>
</body>

</html>

Нет, вы не можете выборочно декодировать части строки JSON (в любом случае, не изначально, и если бы у вас была дополнительная обработка, чтобы вырезать то, что вам не нужно), поэтому просто игнорируйте то, что вам не нужно. . Я не совсем уверен, к чему идет вторая часть. Если у вас есть данные в PHP, вы, конечно, можете выводить эти данные на страницу в любом формате, который вы хотите, JSON является наиболее часто используемым, по моему опыту, при возврате данных в JavaScript.

Jonnix 03.12.2018 00:04

Пожалуйста, задавайте вопросы однозначно и открывайте второй, чтобы задать второй вопрос ?

Matthi 03.12.2018 00:12

Хорошо, это хорошая информация, спасибо, Джон, знаете ли вы какие-либо руководства или что-нибудь, что я могу прочитать или посмотреть, которые показывают, как вы используете возвращенные данные JSON в JavaScript, потому что использование возвращенных данных так, как я хочу, - это проблема, я думаю Я сталкиваюсь.

The Irish Ace Delaney 03.12.2018 00:13

Поскольку вы используете jQuery, я предлагаю прочитать их документацию.

Jonnix 03.12.2018 00:18

@JonStirling Это неправда ... существуют потоковые парсеры JSON, созданные именно для этой цели! (Конечно, в данной конкретной ситуации он не нужен.)

Brad 03.12.2018 00:34

@Brad А какая часть из них родная? Возможно, я ошибаюсь насчет необходимости дополнительной обработки.

Jonnix 03.12.2018 14:15
Поведение ключевого слова "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) для оценки ваших знаний,...
3
6
98
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вы можете создать новый массив данных, которые хотите вернуть в JS. Например, внутри своей функции вы можете изменить свой код, чтобы он выглядел так:

$Json = json_decode($JsonContents);
$output = [];

for ($x = 1; $x <= 10; $x++) {
    $hint = [];
    $hint['brand'] = $Json->hints[$x]->{'food'}->{'brand'};
    $hint['label'] = $Json->hints[$x]->{'food'}->{'label'};
    $output[] = $hint;
}

return $output;

Затем вы можете вернуть эти данные так

echo json_encode(getFoodFromAPI($ingr));

Ваш JS будет выглядеть так:

foodSearched.forEach(function(hint) {
    console.info('Brand is ' + hint.brand + ' and label is ' + hint.label);
});

Вы близки к достижению своей цели, вам просто нужно вернуть только «разбитые» данные запроса API в HTTP-запрос JS. На данный момент вы выполняете правильную логику PHP, разбивая только те данные, которые вы хотите вернуть в JS, но вы используете $JsonRec = json_encode($Json);, который отправляет обратно все запроса API, а не вашу логику PHP.

Надеюсь это поможет.

Вот рабочий пример, который вы можете просто протестировать

# Eggs
$response = json_decode(file_get_contents('https://api.edamam.com/api/food-database/parser?ingr=egg&app_id=47971bbd&app_key=15ddd5fb6a552c59762e2dc7093d5f85'));

$output = [];

for ($x = 1; $x <= 10; $x++) {
    $hint = [];
    $hint['brand'] = $response->hints[$x]->{'food'}->{'brand'};
    $hint['label'] = $response->hints[$x]->{'food'}->{'label'};
    $output[] = $hint;
}

header('Content-Type: application/json');
var_dump(json_encode($response)); # Here is what your JS would see
die();

Вау, это было действительно полезно, спасибо Jaquarh, я получаю сообщение об ошибке в моем Javascript, в котором говорится, что foodSearched.forEach не является функцией. Следует ли мне использовать другую функцию в моем случае?

The Irish Ace Delaney 03.12.2018 00:43

Console.log (foodSearched) и убедитесь, что это массив - я использовал jQuery, когда ответил на этот вопрос, поэтому вам, возможно, придется выполнить цикл вручную, используя foodSearched.length.

Jaquarh 03.12.2018 00:46

Итак, у меня работает функция forEach, но это похоже на то, что все данные с моего php хранятся в одном индексе, у меня PHP и JS увеличиваются правильно, исходя из того, что я вижу. Нужно ли мне увеличивать индекс foodSearched, поскольку теперь это массив? Я тоже не могу использовать. модификатор, как вы это делаете для цикла forEach.

The Irish Ace Delaney 03.12.2018 02:13

var_dump () массив $ output в PHP и убедитесь, что он правильный, я не тестировал код - я просто поместил его туда, чтобы вы знали, что вы делаете не так. $ output должен быть многомерным массивом вида [['brand' => '...', 'label' => '...'], ['brand' => '...', 'label' => '...']] и т.д ...

Jaquarh 03.12.2018 11:20

Да, PHP кажется прекрасным и правильно структурированным, когда данные $ output передаются в JS, тогда он не сохраняет индексы и т.д., все данные помещаются в первый индекс массива foodSearched внутри моего JS, нужно ли мне это делать что-то в моем javascript для увеличения массива или что-то в этом роде?

The Irish Ace Delaney 03.12.2018 15:20

Вы можете прокомментировать console.info (foodSearched); вывод для меня, чтобы я мог понять, что вы имеете в виду, используете ли вы заголовок («Content-Type application / json») и гарантируете, что вы только повторяете данные, ничего больше?

Jaquarh 03.12.2018 16:11

["Array↵ (↵ [brand] => Sogo Bakery, Inc.↵ [labe… Inc», «label»: «ХЛЕБ», «category»: «Упакованные продукты»})] Это то, что я вижу, но это сложно чтобы вставить сюда, вот и его изображение. Это то, что отображается на консоли i.imgur.com/2ro2xtL.png

The Irish Ace Delaney 03.12.2018 16:56

Как вы выводите переменную $ output обратно в JS? Это должно быть просто echo $ output; похоже, вы это экспортируете

Jaquarh 03.12.2018 17:24

echo json_encode (getFoodFromAPI ($ ingr)); это эхо внизу моего php обратно к моему JS.

The Irish Ace Delaney 03.12.2018 20:56

На самом деле я не знаю, почему у вас не работает, есть ли у вас заголовок (Content-Type: application / json); прежде чем использовать json_encode ()? Если да, то я понятия не имею, почему он так себя ведет, может быть, еще один вопрос по SO, чтобы мы могли увидеть код, который у вас есть, потому что мой работает, когда я пробую его на localhost

Jaquarh 03.12.2018 21:51

Не волнуйтесь, Jaquarh, ваша помощь была потрясающей, я сделаю еще один пост и посмотрю, что я могу с этим сделать, еще раз спасибо.

The Irish Ace Delaney 03.12.2018 22:13

Итак, немного поработав с массивом в моем JavaScript, я получил ваше решение сверху, спасибо Jaquarh!

The Irish Ace Delaney 04.12.2018 00:21

Не волнуйся, приятель, не стесняйтесь обновить мой ответ своим рабочим решением, чтобы помочь будущим зрителям :) плохо одобрять правки

Jaquarh 04.12.2018 11:17

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