Restituire JSON da PHP a JavaScript?


135

Ho uno script PHP che viene chiamato tramite jQuery AJAX. Voglio che lo script PHP ritorni i dati in formato JSON su javascript. Ecco lo pseudo codice nello script PHP:

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

Fondamentalmente, ho bisogno dei risultati dei due per inserire i loop in $ json.

Risposte:


194

Php ha una funzione di serializzazione JSON integrata.

json_encode

json_encode

Ti preghiamo di usarlo se puoi e non soffrire della sindrome di Non inventato qui.


2
Eccellente grazie. In realtà l'avevo cercato prima di pubblicare su SO, ma non pensavo che sarebbe stato disponibile sul mio hosting.
AquinasTub

Questa "risposta" non è completa e piuttosto inutile. Vedi la risposta di aesede per informazioni più complete.
Funk Doc,

@FunkDoc l'OP in questione stava mettendo insieme JSON a mano, supponendo che fosse la loro unica scelta. Sapere che non era la loro unica scelta era una soluzione adatta. Non vi è alcun obbligo che il risultato finale di quel JSON venga emesso come risposta HTTP. Le informazioni "aggiungi un'intestazione", sebbene utili per una situazione, non ti aiuteranno se quello che stai facendo con quel JSON non è semplicemente "restituirlo alla lettera". La domanda non ha aggiunto chiarimenti al caso d'uso.
Kent Fredric,

(Inoltre, impostare l'intestazione non è strettamente necessario per AJAX. Chiedo scusa se sembro brusco, ma l'ombra data dalla parola "risposta" tra virgolette mi ha fatto davvero male, era 10 anni fa, lascialo già morire. Sono passato da PHP così tanto tempo fa che la lingua in cui mi sono trasferito sono adesso anche allontanandosi dal).
Kent Fredric

145

Ecco un paio di cose mancanti nelle risposte precedenti:

  1. Imposta l'intestazione nel tuo PHP:

    header('Content-type: application/json');
    echo json_encode($array);
  2. json_encode()può restituire un array JavaScript anziché JavaScript oggetto , vedere:
    Restituzione di JSON da uno script PHP
    Questo potrebbe essere importante sapere in alcuni casi poiché gli array e gli oggetti non sono gli stessi.


2
È importante notare che i dati vengono salvati anziché restituiti ! Mi ha morso per un bel po 'quando ho appreso per la prima volta il concetto. Perché nella programmazione generale, di solito quasi tutto viene restituito non "stampato".
Juha Untinen,

Ehi @Juha, tieni presente che json_encode()(come tutte le funzioni) restituisce sempre qualcosa (incluso NULL); puoi stampare i dati, elaborarli e quindi stamparli, assegnandoli a una variabile per un uso successivo, salvarli in un file, ecc ... Puoi leggere di più returnin PHP: Restituzione di valori . Inoltre puoi (e dovresti!) Verificare ciò che ogni funzione che non conosci restituisce, vedi il nostro esempio json_encode () che indica Restituisce una stringa codificata JSON in caso di successo o FALSO in caso di fallimento.
aede l'

Allora, mi chiedevo perché return json_encode($jsonArray);non funzionasse (AngularJS http.get non ha ottenuto nulla), fino a quando non l'ho notato più tardi :)
Juha Untinen

83

C'è una sezione JSON nella documentazione di PHP. Tuttavia, avrai bisogno di PHP 5.2.0.

A partire da PHP 5.2.0, l'estensione JSON è raggruppata e compilata in PHP per impostazione predefinita.

In caso contrario, ecco la libreria PECL che puoi installare.

<?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

Di solito ti interesserebbe anche avere una struttura per i tuoi dati alla fine della ricezione:

json_encode($result)

Ciò conserverà anche le chiavi dell'array.

Ricorda che json_encode funziona solo su dati codificati utf8.


4

È possibile utilizzare Simple JSON per PHP . Invia le intestazioni che ti aiutano a forgiare il JSON.

Sembra :

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

Avvertenza: JSON semplice per PHP è concesso in licenza GPLv2, quindi il tuo codice deve essere open-source per poterlo utilizzare.
Jamie Birch,

1
Ora licenza MIT :)
Alexis Paques,

1
@JamieBirch In pratica, penso che tu abbia frainteso il funzionamento di GPL. Se parlassi di AGPL, allora ti interesseresti a qualcosa. Ma vasti banchi di Internet sono basati sul software GPL e non hanno l'obbligo di rendere open source il loro codice, perché non stanno dando agli utenti alcun eseguibile sotto il loro controllo, fornendo solo un'interfaccia. L'unico obbligo che hanno è che anche a chi danno copie digitali del progetto debba essere data la fonte.
Kent Fredric,

1

$ msg = "Inserisci nome utente o password errati"; $ Responso = json_encode ($ msg);

echo "{\"status\" : \"400\", \"responce\" : \"603\", \"message\" : \"You Enter Wrong Username OR Password\", \"feed\":".str_replace("<p>","",$responso). "}";
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.