Возвращаете JSON из PHP в JavaScript?


135

У меня есть PHP-скрипт, который вызывается через JQuery AJAX. Я хочу, чтобы PHP-скрипт возвращал данные в формате JSON в javascript. Вот псевдокод в скрипте PHP:

$json = "{";
foreach($result as $addr)
{
    foreach($addr as $line)
    {
        $json .= $line . "\n";
    }
    $json .= "\n\n";
}
$json .= "}";

По сути, мне нужно, чтобы результаты двух циклов for были вставлены в $ json.

Ответы:


194

Php имеет встроенную функцию сериализации JSON.

json_encode

json_encode

Пожалуйста, используйте это, если вы можете и не страдаете синдромом «Не изобретено здесь».


2
Отлично, спасибо. Я действительно посмотрел это перед публикацией на SO, но я не думал, что это будет доступно на моем хостинге.
AquinasTub

Этот «ответ» не является полным и довольно бесполезным. Смотрите ответ от Aesede для более полной информации.
Funk Doc

@FunkDoc рассматриваемый ОП связывал вместе JSON вручную, предполагая, что это был их единственный выбор. Знание, что это не был их единственный выбор, было подходящим решением. Не существует обязательства, что конечный результат этого JSON будет отправлен как HTTP-ответ. Информация «добавить заголовок», хотя и полезна для одной ситуации, не поможет вам, если то, что вы делаете с этим JSON, не просто «дословно возвращает ее на веб-страницу». Вопрос не добавил пояснения к случаю использования.
Кент Фредрик

(Кроме того, установка заголовка не является строго необходимой для AJAX. Извинения, если я выгляжу резкими, но оттенок, заданный словом «ответ» в кавычках, на самом деле меня просто ранил, это было 10 лет назад, пусть он уже умрет. Я перешел от PHP так давно, что от языка, на который я перешел, я теперь тоже ухожу.)
Кент Фредрик,

145

Вот несколько вещей, отсутствующих в предыдущих ответах:

  1. Установите заголовок в вашем PHP:

    header('Content-type: application/json');
    echo json_encode($array);
  2. json_encode()может возвращать массив JavaScript вместо объекта JavaScript , см .:
    Возвращение JSON из сценария PHP
    Это может быть важно знать в некоторых случаях, так как массивы и объекты не совпадают.


2
Важно отметить, что данные отображаются, а не возвращаются ! Это меня немного поразило, когда я впервые изучил концепцию. Потому что в общем программировании почти все обычно возвращается не «напечатанным».
Юха Унтинен

Эй @Juha, имей в виду, что json_encode()(как и все функции) всегда что-то возвращает (в том числе NULL); Вы можете распечатать данные, обработать их, а затем распечатать, передав их в переменную для последующего использования, сохранить в файл и т. д. Вы можете узнать больше об этом returnв PHP: Возврат значений . Также вы можете (и должны!) Проверить, что возвращает каждая функция, которую вы не знаете, см. Наш пример json_encode (), в котором говорится: Возвращает JSON-кодированную строку в случае успеха или FALSE в случае неудачи.
aesede

Тогда мне было интересно, почему return json_encode($jsonArray);не сработало (AngularJS http.get ничего не получил), пока позже не заметил это :)
Юха Унтинен,

83

В документации PHP есть раздел JSON . Вам понадобится PHP 5.2.0, хотя.

Начиная с PHP 5.2.0, расширение JSON связывается и компилируется в PHP по умолчанию.

Если вы этого не сделаете, вот библиотека PECL, которую вы можете установить.

<?php
    $arr = array ('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5);

    echo json_encode($arr); // {"a":1,"b":2,"c":3,"d":4,"e":5}
?>

13

Обычно вам будет интересно иметь некоторую структуру ваших данных на стороне получателя:

json_encode($result)

Это сохранит и ключи массива.

Помните, что json_encode работает только с данными, кодированными в utf8.


4

Вы можете использовать Simple JSON для PHP . Он отправляет заголовки, которые помогут вам создать JSON.

Это выглядит как :

<?php
// Include the json class
include('includes/json.php');

// Then create the PHP-Json Object to suits your needs

// Set a variable ; var name = {}
$Json = new json('var', 'name'); 
// Fire a callback ; callback({});
$Json = new json('callback', 'name'); 
// Just send a raw JSON ; {}
$Json = new json();

// Build data
$object = new stdClass();
$object->test = 'OK';
$arraytest = array('1','2','3');
$jsonOnly = '{"Hello" : "darling"}';

// Add some content
$Json->add('width', '565px');
$Json->add('You are logged IN');
$Json->add('An_Object', $object);
$Json->add("An_Array",$arraytest);
$Json->add("A_Json",$jsonOnly);

// Finally, send the JSON.

$Json->send();
?>

Предупреждение: Simple JSON for PHP лицензирован по GPLv2, поэтому для его использования ваш собственный код должен быть с открытым исходным кодом.
Джейми Бёрч

1
Теперь лицензия MIT :)
Алексис Пак

1
@JamieBirch На практике, я думаю, вы не понимаете, как работает GPL. Если бы вы говорили о AGPL, то вы бы на что-то. Но огромные возможности Интернета построены на программном обеспечении GPL и не обязаны открывать исходный код своего кода, потому что они не дают пользователям никакого исполняемого файла под их контролем, а только предоставляют интерфейс к нему. Единственное обязательство, которое у них есть, заключается в том, что любому, кому они дают цифровые копии проекта, также должен быть предоставлен источник.
Кент Фредрик

1

$ msg = "Вы ввели неверное имя пользователя или пароль"; $ Responso = json_encode ($ MSG);

echo "{\"status\" : \"400\", \"responce\" : \"603\", \"message\" : \"You Enter Wrong Username OR Password\", \"feed\":".str_replace("<p>","",$responso). "}";
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.