Почему json_encode заключает квадратные скобки вокруг моего объекта json?

У меня есть функция в PHP, которая ниже:

public function displayMenuType() {

$stmt = $this->conn->query("SELECT * FROM `Type`") or die($this->conn->error);

$json = array();
if($stmt) {
while($result = mysqli_fetch_all($stmt,MYSQLI_ASSOC)) {
$json = json_encode($result, JSON_PRETTY_PRINT);
}
echo $json;
} else {
return false;
}
}

Проблема в том, что вывод не такой, как я ожидал бы увидеть из объекта json, он все в одной строке и по какой-то причине в массиве / квадратных скобках. Куда я пошел не так? Выход ниже:

[ { "ID": "1", "Type": "Classic Starters", "Description": "" }, { "ID": "2", "Type": "Special Starters", "Description": "" }, { "ID": "3", "Type": "Tapas Menu", "Description": "" }, { "ID": "4", "Type": "Speciality Curry Dishes", "Description": "" }, { "ID": "5", "Type": "Healthier Options", "Description": "Using coconut oil or coconut milk, no ghee, no sugars, we present our healthier range of curries." }, { "ID": "6", "Type": "Traditional Curries", "Description": "" }, { "ID": "7", "Type": "Tandoori & Grilled", "Description": "" }, { "ID": "8", "Type": "Biryanis", "Description": "" }, { "ID": "9", "Type": "Stir Fry's", "Description": "Our new range of Stir fry\u2019s, all made with chicken tikka, served with salad & mint sauce." }, { "ID": "10", "Type": "Nanbabs", "Description": "A choice of Stirfry\u2019s made with chicken tikka, served on a fresh nan bread with mint sauce." }, { "ID": "11", "Type": "Vegetarian Side Dishes", "Description": "" }, { "ID": "12", "Type": "Rice & Chips", "Description": "" }, { "ID": "13", "Type": "Rice Box", "Description": "" }, { "ID": "14", "Type": "Breads", "Description": "" }, { "ID": "15", "Type": "Dips & Drinks", "Description": "" } ]

-1

Решение

Согласно его документации mysqli_fetch_all() возвращает набор строк (массив). Поскольку этот массив имеет числовые последовательные ключи, он кодируется как массив Javascript json_encode(), Внешние квадратные скобки в сгенерированном JSON обозначают этот массив.

Каждый элемент массива возвращается mysqli_fetch_all() сам массив, но из-за MYSQLI_ASSOC аргумент, они являются ассоциативными массивами, то есть они имеют строковые ключи. Такие массивы кодируются как объекты Javascript json_encode(), Они заключены в фигурные скобки в формате JSON. F.E. { "ID": "1", "Type": "Classic Starters", "Description": "" }

Аргумент JSON_PRETTY_PRINT говорит json_encode() создать хорошо отформатированный JSON, который может быть легко прочитан людьми. Но все напрасно, если вы echo значение, которое он возвращает в контексте HTML, а затем посмотрите на него в браузере. Браузер не заботится о новых строках и пробелах; он отображает любую последовательность пробелов и символов новой строки как один пробел.

Проверьте исходный код страницы в браузере, и вы увидите, что JSON довольно отформатирован.

0

Другие решения

Квадратные скобки означают массив JSON, который вы хотите, так же, как вы хотите массив массива json, я полагаю.

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

    if($stmt) {
$array = array();
while($result = mysqli_fetch_all($stmt,MYSQLI_ASSOC)) {
$array[] = $result;
}
$json = json_encode($array, JSON_PRETTY_PRINT);
header('Content-Type: application/json');
echo $json;
exit;
}
1

Ну очевидная ошибка в том, что вы переписываете $json каждый раз вокруг цикла.

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

public function displayMenuType() {

$stmt = $this->conn->query("SELECT * FROM `Type`")
or die($this->conn->error);

$json = array();
if($stmt) {
while($result = mysqli_fetch_all($stmt,MYSQLI_ASSOC)) {
$json[] = $result;
}
echo json_encode($json);
} else {
return json_encode(['result'=>false]);
}
}
0

mysqli_fetch_all возвращает все результаты вашего запроса, которые будут представлены в виде массива ассоциативных массивов. Квадратные скобки являются синтаксисом массива, поэтому квадратные скобки должны присутствовать правильно, если целью является показать объект JSON. Без квадратных скобок слово JSON-парсера знает, как интерпретировать запятые между каждым объектом.

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

$json = array();
if ($stmt) {
while ($row = mysqli_fetch_assoc($stmt)) {
$json[] = $row;
}
echo json_encode($json);
} else {
return false;
}
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector