Idee php json_encode to jquery parse decode

Am dat peste o ciudatenie si nu am idee cum sa o rezolv, poate imi dati voi o idee.
Se da in php un array de forma:

$array_php = array (
  222 => '<span class="pret_normal" id="pret_gr_pr">29.00</span>',
);

acea variabila am nevoie sa o bag intr-un jquery care ulterior o va afisa in pagina in functie de ce butoane apasa vizitatorul pe acolo. De obicei fac treaba asta de forma

var prod_txt = \' '.json_encode($array_php).' \';
var prod_info = jQuery.parseJSON(prod_txt);

in sursa paginii apare de forma:

var prod_txt = '{"222":"<span class=\"pret_normal\" id=\"pret_gr_pr\">29.00<\/span>"}';
var prod_info = jQuery.parseJSON(prod_txt);
console.log(prod_info);

problema e ca prod_txt il vede ca string invalid json si normal ca nu il poate parsa.
Am incercat cu diferite combinatii de encodare json (Bitmask consisting of JSON_HEX_QUOT, JSON_HEX_TAG, JSON_HEX_AMP, JSON_HEX_APOS, JSON_NUMERIC_CHECK, JSON_PRETTY_PRINT, JSON_UNESCAPED_SLASHES, JSON_FORCE_OBJECT, JSON_UNESCAPED_UNICODE.) dar nici o varianta nu a mers.

Aveti idee unde e problema de nu poate parsa sirul ala in javascript, de ce il vede ca invalid? Sau idei de a face treaba asta sa mearga.

Păi eu nu ințeleg de ce este nevoie să-l parsezi încă o dată.

var prod_txt = <?php echo json_encode($array_php); ?>;
console.log(prod_txt);

(fără ghilimele).

uite aici cum iese, normal ar trebui sa se afiseze “ok working” dar nu merge.
http://jsfiddle.net/e90qL3gu/

http://jsfiddle.net/e90qL3gu/1/

faza aia nu am incercato :)) ms, acum vad ca o ia :slight_smile: nu stiu de ce, dar mereu foloseam parserul (asa am gasit pe w3school si in alte parti) nu mi-a trecut prin cap sa testez fara parsare in js :stuck_out_tongue:
ms inca o data.

http://www.w3fools.com/

:smiley:

Sau, fara parseJSON, il scrii direct ca object.
http://jsfiddle.net/e90qL3gu/2/

array-ul de baza din php e mult mai mare (multi-array cu gramaje, preturi, culori, si alte valori) si problema aparea de fapt la conflictul dintre ghilimele din partea de html. (exemplul pus de mine mai sus contine de fapt doar bucata din array cu probleme)
pornind de la ideea lui @tachyean am reusit sa fac un addslashes la ghilimele inainte sa il pasez la json_encode si dupa aia restul a mers fara probleme.
celelalte solutii nu ma ajuta in situatia mea (scriptul find mult mai complex), dar oricum, am rezolvat problema.

Ca idee, dacă ceva nu e în regulă cu json_encode din PHP (sau orice alt limbaj), cel mai probabil ai dat de un bug al parserului. Nu cred că trebuie să te complici cu slash-uri, pentru că se ocupă funcția de toată povestea asta…

Parsarea unui string ce știi sigur că-i json nu face decât să îți încetinească aplicația, mai ales dacă ai un array mare.

Btw, dacă json-ul vine prin ajax, nu uita să specifici headerul ca atare:

header('Content-Type: application/json');

Eu unul am codat tot felul de date prin json, inclusiv diacritice și simboluri din koreană și japoneză fără nici un fel de probleme…


O alternativă la ce ai tu ar fi să renunți la a trimite markup prin json. Pentru a evita folosirea unui framework (e.g. backbone, angular etc) ai putea trimite datele prin json la modul următor:

array(
  "222" => array(
    "val" => '29,00',
    "el" => "#pret_gr_pr"
  )
);

Cheia el reprezentând ID-ul elementului în care urmează să injectezi valoarea respectivă. Combinat cu un template engine pe frontend (mustache, handlebars) ar trebui să ai un cod curat și refolosibil (atât pe frontend cât și pe backend) și să scapi de multe bătăi de cap :smile:

2 Likes