Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Javascript json_encode > JSON.parse() array

I the following PHP code:

echo "<img src='../images/edit.png' onclick='showEditDiv(" . json_encode($row) . ");'>";

Here is the HTML result:

<img src='../images/edit.png' onclick='showEditDiv({"ID":"2","NAME":"John Smith","EMAIL":"[email protected]"});'>

And here is the Javascript code:

function showEditDiv(data) {
  alert(data);
  data = JSON.parse(data);
  alert(data);
  for (i=0; i< data.length; i++){ 
    alert(data[i]);
  };
}

The problem is I'm not getting the desired array in the JS parameter. The first alert shows "[object Object]" and that's all, no more alerts. Where is the problem? My code is based on the examples I found here. All I want is to pass an array to JS function, which is in a separated .js file. I don't want to use JQuery, prefer native JS.

like image 407
tcxbalage Avatar asked Dec 11 '22 08:12

tcxbalage


2 Answers

You aren't passing JSON to the function (JSON would be a string, hence ending/beginning with quotes). What you're passing is a JavaScript object literal. See the difference:

Object literal

{"ID":"2","NAME":"John Smith","EMAIL":"[email protected]"}

JSON string

"{\"ID\":\"2\",\"NAME\":\"John Smith\",\"EMAIL\":\"[email protected]\"}\"
// or, easier than escaping all those quotes..
'{"ID":"2","NAME":"John Smith","EMAIL":"[email protected]"}'

Of course, for your purposes, the object literal may be easier to work with. In that case you just need to remove the JSON.parse from your JavaScript code:

function showEditDiv(data) {
    // The below won't work unless you change your input data to a
    // JS array literal..
    /* for (i=0; i< data.length; i++){ 
        alert(data[i]);
    }; */

    // ..but you can do this (though it's risky to iterate through keys
    // on an object without at least using HasOwnProperty)
    for (var key in data) {
        alert(data[key]);
    }
}
like image 116
Chris Hayes Avatar answered Dec 24 '22 11:12

Chris Hayes


All I want is to pass an array to JS function

That's an object in JS, not an array. (PHP nomenclature is a bit weird.) And you have successfully passed it. However, when you convert an object into a string (which is what alert has to do), it shows up as [object Object]. If you want the string representation, convert it back into a string:

alert(JSON.stringify(data));

You don't need to JSON.parse it, since it already is an object - you have inserted it as a literal from PHP, not as a string. In fact, running JSON.parse in your code should cause an error, which is why no more alerts - code stops, complaining about bad taste in JSON.parse's mouth.

like image 27
Amadan Avatar answered Dec 24 '22 09:12

Amadan