2013-08-30 8 views
9

Próbuję utworzyć wspólny plik stałych do dzielenia się między php i javascript, używając JSON do przechowywania stałych. Ale zastanawiam się, dlaczego przekazać JSON z PHP do javascript przy użyciu json_encode() przez echo deklaracji json.Przekazywanie PHP JSON do Javascript: echo json_encode vs echo json deklaracja

Powiedzmy mam PHP JSON

<?php 

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

?> 

Googling wydaje typowy sposób przechodząc z powrotem do javascript korzysta

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

to uważam, że będę musiał użyć czegoś jak $.getScript() aby odczytać plik php, aby uzyskać $json_obj, a następnie użyć parseJSON(), aby był on użyteczny w javascript.

Ale dlaczego nie zamiast

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

ten sposób wszystko, co musisz zrobić, to załadować skrypt bezpośrednio i masz json gotowe do użycia bezpośrednio.

Czy istnieje szczególny powód, dla którego bardziej korzystne jest użycie json_encode(), a następnie po prostu echo deklaracji do javascript?

+0

użyć 'json_encode' na tablic i obiektów, co czy istnieje tylko ciąg znaków, nie trzeba go kodować. – slash197

+0

Co się stanie, jeśli zmienna, którą chcesz przechowywać swoje dane po stronie klienta, zmieni nazwę? A co jeśli chcesz używać tych samych danych przy wielu okazjach? Co jeśli coś już jest przechowywane w zmiennej globalnej 'json'? ... – Sirko

+0

jeśli masz tablicę lub nawet obiekt, taki jak obiekt stdClass, łatwiej jest użyć json_encode, a następnie przepuścić przez tablicę/obiekt, aby wydrukować zawartość. –

Odpowiedz

7

W twoim przypadku $json_obj jest już ciągiem. Więc nie jest konieczne. Ale jeśli masz tablicę, którą chcesz przekazać do javascript json_encode, pomoże ci to.

0

użyć json_encode jeśli używasz tablicy PHP nie ciąg znaków:

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

echo json_encode($array); 

jeśli zadzwonisz json_encode na sznurku dostaniesz:

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

Argument json_encode() powinny być dane PHP strukturę, a nie ciąg, który jest już w formacie JSON. Używa się tego, gdy chcemy przekazać obiekt PHP do Javascript.

4

Wszystko zależy od tego, co chcesz wysłać z serwera do klienta - czy to danych (JSON), czy jakiegoś kodu.

dwa podejścia:

  1. Echo plik JSON na serwerze - wtedy wydrukować dokument JSON i ustaw odpowiedź Content-Type do application/json. W ten sposób możesz użyć dowolnej biblioteki AJAX, którą chcesz, np. $.get lub surowej XMLHttpRequest itd. Jest to sposób przekazywania danych.

  2. Echo kodu JavaScript na serwerze, a następnie użyj $.getScript, aby go załadować. To sposób na przekazywanie kodu. Jest to potencjalnie mniej bezpieczne, ponieważ twój kod może zawierać nie tylko JSON, ale także dowolny kod arbitralny. Tak więc, jeśli atakujący może narazić na szwank twój serwer, mógłby wysłać kod do dowolnego klienta w celu zdalnego wykonania.

Jeśli chcesz przekazać tylko dane, przejdź do pierwszego podejścia. Jest czystszy i bezpieczniejszy.

Dodatkowo, jeśli kiedykolwiek skończysz pisać nakładkę w innym środowisku, powiedz inny język programowania, będziesz mógł ponownie użyć tego samego punktu końcowego zwracającego JSON. Będzie trudniej, jeśli zwrócisz kod JavaScript.

0

json_encode to funkcja, która przekształca tablicę PHP w łańcuch JSON i nic więcej. Ponieważ zmienna jest już ciągiem JSON, nie jest wymagana żadna dodatkowa konwersja i można ją po prostu odtworzyć.

Aby dostać się do łańcucha $json_obj z tablicy Twój kod będzie wyglądał jak ten

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

$json_obj = json_encode($json_array); 
1

Choć może wydawać się przesadą dla danego problemu, chciałbym przejść do opcji json_encode/parsowania jeszcze. Czemu? ty pytasz. Pomyśl o tym, jak uniknąć duplikacji. Jeśli kodujesz/parsujesz, możesz zachować stałe w obiekcie, który jest czytelny dla Ciebie przez kod PHP. I to samo dla twojego kodu JS.

Po prostu eliminuje potrzebę korzystania z niego.

0

constant.php

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

====================== koniec pliku constant.php =======

w PHP można uzyskać dostęp za pomocą

$array["<key>"] 

w JavaScripcie, można uzyskać dostęp za pomocą

contants.const1, .... 
1

Przechodząc PHP JSON do JavaScript i czytanie
var stuff = <?php print json_encode($datajson); ?>; var arr = new Array(); arr= JSON.parse(stuff); document.write((arr[0].cust_code);

0

Zazwyczaj jest to, co robię, najbezpieczniejszą drogę Mam znaleziono:

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

Nie potrzebujesz 'JSON.parse()' – Vallentin