Невозможно использовать данные Json из текста ответа ajax

Я работаю с javascript для извлечения данных из базы данных с помощью ajax. Текст ответа следующий:

{"task":"r","category":"s","duration":"0"}{"task":"read","category":"s","duration":"10"}{"task":"read","category":"o","duration":"10"}

Я использовал json_encode($data) в скрипте php, который извлекает данные из базы данных MySql. Как мне сохранить задачу, категорию и продолжительность текста ответа в отдельных переменных. Я не могу использовать полученный ответ. Вот код:

 if (mysqli_query($conn,$query)){
    $result = mysqli_query($conn,$query);
    $tasks = mysqli_fetch_all($result,MYSQLI_ASSOC);
    foreach($tasks as $task){
        echo json_encode($task);
    }
    mysqli_free_result($result);
}

 get(url){
    let xhr = new XMLHttpRequest();
    xhr.open('GET',url,true)
    xhr.onload= function(){
        if (this.status===200){
            let data = this.responseText;
            console.info(data);
        }
    }
    xhr.send();
}

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

charlietfl 20.05.2018 12:33

Опубликованный код содержит несколько файлов json. Он должен выглядеть как {[content_of_first_bracked, content_of_second_bracked, ...]}, или вам нужно добавить текст / знак разделителя и разделить внутри javascript, а затем jsondecode каждую часть

dark_982 20.05.2018 12:34

Да, я использовал эхо в цикле. Что я должен использовать вместо этого, чтобы получить правильный ответ в скрипте php?

Elon Musk 20.05.2018 12:38

Вы должны поместить все результаты в массив, а затем закодировать этот массив после завершения цикла.

Barmar 20.05.2018 12:47
Поведение ключевого слова "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
4
69
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Попробуйте объявить тип полученных данных type с помощью dataType: "json"

Как это:

$.ajax({
       type: "POST",
       url:"php/page.php",
       dataType:"json",
       success: function(data)
         {
            console.info(data);
         },
       error:function (data) {
             console.info("Error"+data)}
  });

Также ваши данные должны быть одним массивом json, а не несколькими объектами json.

Попробуй это:

$array = new Array();

$ c = 0;

while(condition){
  $array[$c] = your_c_object
  $c++;
}

echo json_encode($array);

У вас должен быть такой вывод в console.info

[{"task":"r","category":"s","duration":"0"}, 
{"task":"read","category":"s","duration":"10"}, 
{"task":"read","category":"o","duration":"10"}]

В переменной $c нет необходимости. Просто используйте $array[] =, чтобы протолкнуть массив.

Barmar 20.05.2018 12:48

Как упоминалось в вопросе, ваш ответ не в правильном формате JSON. Ваш ответ имеет формат:

{"task":"r","category":"s","duration":"0"}{"task":"read","category":"s","duration":"10"}{"task":"read","category":"o","duration":"10"}

Принимая во внимание, что действительный ответ JSON должен быть в формате

[{"task":"r","category":"s","duration":"0"},{"task":"read","category":"s","duration":"10"},{"task":"read","category":"o","duration":"10"}]

Как только это будет в правильном формате, декодируйте JSON с помощью функции json_decode и используйте ответ в цикле.

См. Пример ниже для правильного декодирования:

$str = '[{"task":"r","category":"s","duration":"0"},{"task":"read","category":"s","duration":"10"},{"task":"read","category":"o","duration":"10"}]';

$response = json_decode($str, true);

foreach ($response as $res) {
   echo $res['task'] . ' ==== ' . $res['category'] . ' ===== ' . $res['duration'];
}

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

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