Повернення 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 .= "}";

В основному, мені потрібні результати двох циклів, які потрібно вставити в $ json.

Відповіді:


194

Php має вбудовану функцію серіалізації JSON.

json_encode

json_encode

Будь ласка, використовуйте це, якщо можете і не страждаєте синдромом Not Invented Here.


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
Важливо зазначити, що дані лунають замість повернення ed! Це мене трохи покусало при першому вивченні концепції. Тому що в загальному програмуванні майже все повертається не «друкованим».
Juha Untinen

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

Тоді мені було цікаво, чому return json_encode($jsonArray);нічого не вийшло (AngularJS http.get нічого не отримав), поки я пізніше цього не помітив :)
Juha Untinen

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();
?>

Попередження: Простий JSON для PHP має ліцензію GPLv2, тому ваш власний код повинен бути відкритим кодом, щоб ним користуватися.
Джеймі Береза

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

1
@JamieBirch На практиці я думаю, ви нерозумієте, як працює GPL. Якщо ви говорили про AGPL, то ви б на щось попадалися. Але величезні стяжки Інтернету побудовані на програмному забезпеченні GPL і не зобов’язані відкривати код свого коду, оскільки вони не дають користувачам виконуваного файлу під їх контролем, лише надають інтерфейс до нього. Єдине зобов'язання, яке вони мають, - це те, що всі, кому вони дають цифрові копії проекту, також повинні мати джерело.
Кент Фредрік

1

$ msg = "Ви вводите неправильне ім'я користувача чи пароль"; $ respoo = 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.