Вручную созданные json - данные не работают

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Сергей2003
Сообщения: 92
Зарегистрирован: 2018.08.11, 11:07

Вручную созданные json - данные не работают

Сообщение Сергей2003 »

Для дерева категорий мне надо прочитать из базы данных информацию и подготовить ее в json формате. Если я просто вручную пишу в json - переменную необходимые данные, например:

Код: Выделить всё

        $json = '[
				{"id":"1","text":"Категории","state": {"opened":false},"children":
				[
					{"id":"2","text":"Товары","state":{"opened":false},"children":
					[
						{"id":"3","text":"Бытовая техника","state":{"checked":false}},										
						{"id":"4","text":"Мебель","state":{"checked":false}}
					]
					},
					{"id":"5","text":"Услуги","state":{"opened":false},"children":
					[
						{"id":"6","text":"SPA - салоны","state":{"checked":false}},										
						{"id":"7","text":"Ремонт бытовой техники","state":{"checked":false}}
					]
					}
				]
				}
			]';
а затем выполняю:

Код: Выделить всё

        Yii::$app->response->format = Response::FORMAT_JSON;
        $items = json_decode($json);
все работает нормально. Дерево заполняется и выводится на экран. Но если я формирую json - переменную на основе полученной информации из базы данных, у меня получается следующая строка (это вывод на странице):

Код: Выделить всё

json =[{"id":"1","text":"Категории ","state":{"opened":false},"children":[{"id":"2","text":"Товары","state":{"opened":false},"children":[{"id":"3","text":"Мебель","state":{"checked":false}},{"id":"4","text":"Бытовая техника","state":{"checked":false}}]},{"id":"5","text":"Услуги","state":{"opened":false},"children":[{"id":"6","text":"SPA - салоны","state":{"checked":false}},{"id":"7","text":"Ремонт бытовой техники","state":{"checked":false}}]}]}]
дерево не выводится на экран.
Если опять вручную напишу, т.е. $json присвою полученную строку:

Код: Выделить всё

$json ='[{"id":"1","text":"Категории ","state":{"opened":false},"children":[{"id":"2","text":"Товары","state":{"opened":false},"children":[{"id":"3","text":"Мебель","state":{"checked":false}},{"id":"4","text":"Бытовая техника","state":{"checked":false}}]},{"id":"5","text":"Услуги","state":{"opened":false},"children":[{"id":"6","text":"SPA - салоны","state":{"checked":false}},{"id":"7","text":"Ремонт бытовой техники","state":{"checked":false}}]}]}]':
Все работает.
Подскажите, пожалуйста, что я делаю не так. Как мне сделать, чтобы получилось:

Код: Выделить всё

$json_result = '.$json.';
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Вручную созданные json - данные не работают

Сообщение ElisDN »

А зачем вручную? Формируйте через json_encode.
kawabanga
Сообщения: 806
Зарегистрирован: 2013.10.12, 23:35
Откуда: Новосибирск

Re: Вручную созданные json - данные не работают

Сообщение kawabanga »

ElisDN писал(а): 2019.02.10, 22:05 А зачем вручную? Формируйте через json_encode.
Это слишком просто. :roll:
Сергей2003
Сообщения: 92
Зарегистрирован: 2018.08.11, 11:07

Re: Вручную созданные json - данные не работают

Сообщение Сергей2003 »

Строка json сформирована правильно. Если ее содержимое взять в кавычках и непосредственно присвоить переменной json, то все работает нормально. Зачем формировать массив, а затем преобразовывать его в json, т.е. получится опять та же json строка, что у меня и формируется ? И при чем тут "это слишком просто" ?
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Вручную созданные json - данные не работают

Сообщение ElisDN »

Если выставляете format = Response::FORMAT_JSON, то сам фреймворк внутри сам делает json_encode. Причина в этом. Выставляйте $response->getHeaders()->set('Content-Type', 'application/json; charset=utf-8') вручную с FORMAT_RAW.
Сергей2003
Сообщения: 92
Зарегистрирован: 2018.08.11, 11:07

Re: Вручную созданные json - данные не работают

Сообщение Сергей2003 »

Спасибо. Попробую. А если создать не строкой как я сделал, а с помощью массива. Тогда можно воспользоваться json_encode ? И далее операторы:

Код: Выделить всё

        Yii::$app->response->format = Response::FORMAT_JSON;
        $items = json_decode($json);
отработают корректно. Это так ?
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Вручную созданные json - данные не работают

Сообщение ElisDN »

Код: Выделить всё

Yii::$app->response->format = Response::FORMAT_JSON;
return $array;
Аватара пользователя
SiZE
Сообщения: 2817
Зарегистрирован: 2011.09.21, 12:39
Откуда: Perm
Контактная информация:

Re: Вручную созданные json - данные не работают

Сообщение SiZE »

Код: Выделить всё

return $this->asJson($array);
Сергей2003
Сообщения: 92
Зарегистрирован: 2018.08.11, 11:07

Re: Вручную созданные json - данные не работают

Сообщение Сергей2003 »

array - это должен быть массив ? А как быть со сформированной json - строкой. Воспользоваться
Если выставляете format = Response::FORMAT_JSON, то сам фреймворк внутри сам делает json_encode. Причина в этом. Выставляйте $response->getHeaders()->set('Content-Type', 'application/json; charset=utf-8') вручную с FORMAT_RAW.
Или вместо создания json - строки создать массив и воспользоваться последними предложениями. А можно ли из json - строки создать массив какими-либо функциями ? Посоветуйте, пожалуйста, что лучше сделать.
Аватара пользователя
SiZE
Сообщения: 2817
Зарегистрирован: 2011.09.21, 12:39
Откуда: Perm
Контактная информация:

Re: Вручную созданные json - данные не работают

Сообщение SiZE »

Тебе надо вернуть в ответе json. Получи из базы массив, преобразуй его структуру, оставив массивом и верни через метод return $this->asJson(); иначе зачем тебе фреймворк если ты дублируешь то что уже за тебя написано?! Не надо велосипед изобретать
Сергей2003
Сообщения: 92
Зарегистрирован: 2018.08.11, 11:07

Re: Вручную созданные json - данные не работают

Сообщение Сергей2003 »

Хорошо. Попробую массив создать. Просто я подумал, что сразу создать json - строку будет легче.
Спасибо за предложение.
Ответить