how to use JSON.stringify and json_decode() properly
Solution 1
You'll need to check the contents of $_POST["JSONfullInfoArray"]
. If something doesn't parse json_decode
will just return null
. This isn't very helpful so when null
is returned you should check json_last_error()
to get more info on what went wrong.
Solution 2
When you save some data using JSON.stringify() and then need to read that in php. The following code worked for me.
json_decode( html_entity_decode( stripslashes ($jsonString ) ) );
Thanks to @Thisguyhastwothumbs
Solution 3
When you use JSON stringify then use html_entity_decode first before json_decode.
$tempData = html_entity_decode($tempData);
$cleanData = json_decode($tempData);
Solution 4
None of the other answers worked in my case, most likely because the JSON array contained special characters. What fixed it for me:
Javascript (added encodeURIComponent)
var JSONstr = encodeURIComponent(JSON.stringify(fullInfoArray));
document.getElementById('JSONfullInfoArray').value = JSONstr;
PHP (unchanged from the question)
$data = json_decode($_POST["JSONfullInfoArray"]);
var_dump($data);
echo($_POST["JSONfullInfoArray"]);
Both echo and var_dump have been verified to work fine on a sample of more than 2000 user-entered datasets that included a URL field and a long text field, and that were returning NULL on var_dump for a subset that included URLs with the characters ?&#
.
Solution 5
stripslashes(htmlspecialchars(JSON_DATA))
Wesley Smith
I enjoy working on PHP applications created with MySQL, Laravel, and Vue.js for fun or profit. Mostly, I love to build things that solve problems
Updated on July 09, 2022Comments
-
Wesley Smith almost 2 years
Im trying to pass a mulitidimensional Javascript array to another page on my site by:
using JSON.stringify on the array
assigning the resultant value to an input field
posting that field to the second page
using json_decode on the posted value
then var_dump to test
(echo'ing the posted variable directly just to see if it came through at all)
Javascript on page one:
var JSONstr = JSON.stringify(fullInfoArray); document.getElementById('JSONfullInfoArray').value= JSONstr;
php on page two:
$data = json_decode($_POST["JSONfullInfoArray"]); var_dump($data); echo($_POST["JSONfullInfoArray"]);
The echo works fine but the var_dump returns NULL
What have I done wrong?
This got me fixed up:
$postedData = $_POST["JSONfullInfoArray"]; $tempData = str_replace("\\", "",$postedData); $cleanData = json_decode($tempData); var_dump($cleanData);
Im not sure why but the post was coming through with a bunch of "\" characters separating each variable in the string
Figured it out using
json_last_error()
as sugested by Bart which returnedJSON_ERROR_SYNTAX
-
Bart about 11 yearsCheck the content of
$_POST["JSONfullInfoArray"]
. If something doesn't parsejson_code
will just returnnull
. Also usejson_last_error()
to try and find what went wrong. -
UltraInstinct about 11 yearsA little bit HTML of the form would help too. Look into the request using your browser's inspector, do you see what you expect?
-
Wesley Smith about 11 years@Bart see edit above, you got me where I needed to be, throw up an answer and Ill accept it :), thank you very much
-
Chris Rae about 9 yearsThe answer in here worked for me (and all the other 'answers' below didn't!).
-
Anish about 9 yearsThanks man. Your solution works great!
-
Bayu over 7 yearsI am not sure why
htmlspecialchars()
must there. It will convert the quote character ("
) to"
which is mean can't be processed byjson_decode()
. I am sureJSON
format must be something like{"key":"value"}
, but by usinghtmlspecialchars()
it will convert to{"key":"value"}
how comejson_decode()
processing it? -
Albion S. about 7 yearsI also had to use
urldecode
on PHP for it to work properly. -
Aurovrata almost 7 yearsAs @Albion points out, the string needs to be URI decoded before
json_decode
is invoked.json_decode(urldecode($_POST["JSONfullInfoArray"]));
-
treyBake over 6 yearsworth noting in wp I used the above with stripslashes within the html_entity_decode to make work :
-
MarkSkayff over 5 yearsOk, this is like the right answer and what I was looking for. Saved me a couple of hours of disgusting trial and error.
-
Priyanka Ahire over 3 yearsThanks this is work for me!!! ... In $request["reporthead"] data as string which is from javascript $tempData = \html_entity_decode(stripslashes ($request["reporthead"])); $reportheaddata = json_decode($tempData, true);