Wracasz JSON z PHP do JavaScript?

135

Mam skrypt PHP, który jest wywoływany przez jQuery AJAX. Chcę, aby skrypt PHP zwracał dane w formacie JSON do javascript. Oto pseudo kod w skrypcie PHP:

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

Zasadniczo potrzebuję wyników dwóch pętli for do wstawienia w $ json.

AquinasTub
źródło

Odpowiedzi:

194

Php ma wbudowaną funkcję serializacji JSON.

json_encode

json_encode

Proszę używać, jeśli to tylko możliwe i nie cierpią Nie własna Tutaj zespół.

Kent Fredric
źródło
2
Wspaniale, dziękuję. Właściwie sprawdziłem to przed wysłaniem na SO, ale nie sądziłem, że będzie to dostępne na moim hostingu.
AquinasTub,
Ta „odpowiedź” nie jest kompletna i raczej nieprzydatna. Zobacz odpowiedź od aesede, aby uzyskać pełniejsze informacje.
Funk Doc
@FunkDoc omawiany OP składał ręcznie JSON, zakładając, że był to ich jedyny wybór. Wiedząc, że to nie jedyny wybór, było odpowiednim rozwiązaniem. Nie ma obowiązku, aby wynik końcowy tego JSON był emitowany jako odpowiedź HTTP. Informacja „dodaj nagłówek”, choć przydatna w jednej sytuacji, nie pomoże Ci, jeśli to, co robisz z tym kodem JSON, nie jest po prostu „zwracaniem go dosłownie do strony internetowej”. Pytanie nie wyjaśniło sprawy.
Kent Fredric
(Dodatkowo ustawienie nagłówka nie jest absolutnie konieczne dla AJAX. Przepraszam, jeśli wydaje mi się nagły, ale odcień, jaki daje słowo „odpowiedź” w cudzysłowie, naprawdę mnie zranił, to było 10 lat temu, niech już umrze. Przeszedłem z PHP tak dawno temu, że język, do którego się przeniosłem, teraz również odchodzę od.)
Kent Fredric
145

W poprzednich odpowiedziach brakuje kilku rzeczy:

  1. Ustaw nagłówek w swoim PHP:

    header('Content-type: application/json');
    echo json_encode($array);
  2. json_encode()może zwrócić tablicę JavaScript zamiast obiektu JavaScript , zobacz:
    Zwracanie JSON ze skryptu PHP
    Może to być ważne w niektórych przypadkach, ponieważ tablice i obiekty nie są takie same.

aesede
źródło
2
Należy pamiętać, że dane są wyświetlane jako echo zamiast zwracanych ! To ugryzło mnie na chwilę, kiedy po raz pierwszy poznałem koncepcję. Ponieważ w programowaniu ogólnym prawie wszystko jest zwykle zwracane, a nie „drukowane”.
Juha Untinen
Hej @Juha, pamiętaj, że json_encode()(jak wszystkie funkcje) zawsze zwraca coś (w tym NULL); można wydrukować dane, przetwarza je, a następnie wydrukować go, assing go do zmiennej do późniejszego wykorzystania, zapisać go do pliku, itd ... można przeczytać więcej na temat returnw PHP: Zwracanie wartości . Możesz również (i powinieneś!) Sprawdzić, co zwraca każda nieznana funkcja, zobacz nasz przykład json_encode () stwierdza Zwraca ciąg zakodowany w formacie JSON w przypadku sukcesu lub FALSE w przypadku niepowodzenia.
aesede
Wtedy zastanawiałem się, dlaczego return json_encode($jsonArray);nie działa (http.get w AngularJS nic nie dostał), dopóki później to nie zauważyłem :)
Juha Untinen
83

W dokumentacji PHP znajduje się sekcja JSON . Będziesz jednak potrzebował PHP 5.2.0.

Począwszy od PHP 5.2.0, rozszerzenie JSON jest domyślnie dołączane i kompilowane do PHP.

Jeśli nie, oto biblioteka PECL, którą możesz zainstalować.

<?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}
?>
Ólafur Waage
źródło
13

Zwykle chciałbyś mieć również jakąś strukturę swoich danych u odbiorcy:

json_encode($result)

Pozwoli to również zachować klucze tablicy.

Pamiętaj, że json_encode działa tylko na danych zakodowanych w utf8.

Jukka Dahlbom
źródło
4

Możesz użyć prostego JSON dla PHP . Wysyła nagłówki, które pomagają w tworzeniu formatu JSON.

To wygląda jak :

<?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();
?>
Alexis Paques
źródło
Ostrzeżenie: Simple JSON for PHP jest objęta licencją GPLv2, więc twój własny kod musi być open source, aby go używać.
Jamie Birch
1
Teraz licencja MIT :)
Alexis Paques
1
@JamieBirch W praktyce myślę, że nie rozumiesz, jak działa GPL. Gdybyś mówił o AGPL, byłbyś na czymś. Ale rozległe sieci internetowe są zbudowane na oprogramowaniu GPL i nie mają obowiązku otwierania kodu, ponieważ nie udostępniają użytkownikom żadnego pliku wykonywalnego pod swoją kontrolą, a jedynie zapewniają do niego interfejs. Jedynym ich obowiązkiem jest to, że każdy, komu przekazują cyfrowe kopie projektu, musi również otrzymać źródło.
Kent Fredric
1

$ msg = "Wprowadziłeś niewłaściwą nazwę użytkownika LUB hasło"; $ responso = json_encode ($ msg);

echo "{\"status\" : \"400\", \"responce\" : \"603\", \"message\" : \"You Enter Wrong Username OR Password\", \"feed\":".str_replace("<p>","",$responso). "}";
iamasp
źródło