2013-08-30 25 views
9

Sto provando a creare un file di costanti comune da condividere tra php e javascript, utilizzando JSON per memorizzare le costanti. Ma mi chiedo perché passare il JSON da PHP a javascript usando json_encode() per echeggiare la dichiarazione di JSON.Passare PHP JSON a Javascript: echo json_encode vs echo json declaration

Diciamo che ho il PHP JSON

<?php 

$json_obj = '{"const1": "val", 
      "const2": "val2"    
          }'; 

?> 

Googling, sembra il tipico modo di passare di nuovo al javascript sta usando

<?php echo json_encode($json_obj); ?> 

allora credo che avrei dovuto usare qualcosa come $.getScript() leggere il file php per ottenere $json_obj e quindi utilizzare parseJSON() per renderlo utilizzabile in javascript.

Ma perché non invece

<?php echo 'var json = '.$json_obj; ?> 

In questo modo tutto quello che dovete fare è caricare lo script direttamente e si ha la JSON pronto per l'uso direttamente.

C'è un motivo particolare per cui è più favorevole utilizzare json_encode() quindi semplicemente echoing della dichiarazione su javascript?

+0

Si utilizza 'json_encode' su array e gli oggetti, ciò che si c'è solo una stringa, non c'è bisogno di codificarla. – slash197

+0

Cosa succede se la variabile che si desidera memorizzare i dati sul lato client cambia nome? Cosa succede se si desidera utilizzare gli stessi dati in più occasioni? Cosa succede se qualcosa è già memorizzato nella variabile globale 'json'? ... – Sirko

+0

se si dispone di un array o anche di un oggetto, come l'oggetto stdClass, è più semplice utilizzare json_encode per eseguire il ciclo attraverso l'array/oggetto per stampare il contenuto. –

risposta

7

Nel tuo caso $json_obj è già una stringa. Quindi non è necessario. Ma se hai un array che vuoi passare a javascript json_encode ti aiuterà con questo.

0

Si utilizza json_encode se si utilizza PHP array non una stringa:

$array = array("const1" => "val", "const2" => "val2"); 

echo json_encode($array); 

se si chiama json_encode su una stringa si otterrà:

"{\"const1\": \"val\", \"const2\": \"val2\"}" 
0

L'argomento di json_encode() dovrebbe essere un dato PHP struttura, non una stringa che è già in formato JSON. Lo usi quando vuoi passare un oggetto PHP in Javascript.

4

Tutto dipende da ciò che si desidera inviare dal server al client, sia esso un dato (JSON) o un codice.

due approcci:

  1. Echo un file JSON su un server - allora si stampa il documento JSON e risposta impostato Content-Type a application/json. In questo modo puoi utilizzare qualsiasi libreria AJAX che desideri, come $.get o raw XMLHttpRequest ecc. È un modo per trasmettere i dati.

  2. Echo un codice Javascript su un server e quindi utilizzare $.getScript per caricarlo. È un modo per passare il codice. Questo è potenzialmente meno sicuro, perché il tuo codice può contenere non solo JSON, ma anche qualsiasi codice arbitario. Quindi, se l'attaccante può compromettere il tuo server, potrebbe essere in grado di inviare codice a qualsiasi client per un'esecuzione remota.

Se si desidera passare solo i dati, andare con il primo approccio. È più pulito e più sicuro.

Inoltre, se si finisce mai a scrivere frontend in un ambiente diverso, ad esempio un linguaggio di programmazione diverso, sarà possibile riutilizzare lo stesso endpoint di ritorno JSON. Sarà più difficile se restituisci il codice Javascript.

0

json_encode è una funzione che converte un array PHP in una stringa JSON e niente di più. Poiché la tua variabile $json_obj è già una stringa JSON, non è necessaria alcuna ulteriore conversione e puoi semplicemente farlo eco.

per raggiungere la vostra stringa $json_obj da un array il codice avrebbe guardato come questo

$json_array = array(
    "const1" => "val", 
    "const2" => "val2" 
); 

$json_obj = json_encode($json_array); 
1

Anche se può sembrare eccessivo per il vostro problema particolare, vorrei andare per l'opzione/parse json_encode ancora. Perché? tu chiedi. Beh, pensalo come evitando la duplicazione. Se si codifica/analizza, è possibile mantenere le costanti in un oggetto facilmente leggibile dal proprio codice PHP. E lo stesso per il tuo codice JS.

Elimina semplicemente la necessità di giocherellare con esso.

0

constant.php

<?php 
$array = array("const1" => "val", "const2" => "val2"); 
?> 
<script> 
var contants = <?php echo json_encode($array); ?> 
</script> 

FINE ====================== DI FILE constant.php =======

In PHP è possibile accedere utilizzando

$array["<key>"] 

in JavaScript, è possibile accedere utilizzando

contants.const1, .... 
1

Passando PHP JSON per Javascript e la lettura
var stuff = <?php print json_encode($datajson); ?>; var arr = new Array(); arr= JSON.parse(stuff); document.write((arr[0].cust_code);

0

Di solito questo è quello che faccio, il modo più sicuro che ho trovato:

// holds variables from PHP 
var stuff = {}; 
try { 
    // stuff will always be an object 
    stuff = JSON.parse('<?php echo empty($stuff) ? '{}' : json_encode($stuff) ?>'); 
} catch (e) { 
    if (e instanceof SyntaxError) 
    { 
     // report syntax error 
     console.error("Cannot parse JSON", e); 
    } 
} 
// show resulting object in console 
console.log("stuff:", stuff); 
+0

Non è necessario il 'JSON.parse()' – Vallentin