how to use JSON.stringify and json_decode() properly

128,883

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))
Share:
128,883
Wesley Smith
Author by

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, 2022

Comments

  • Wesley Smith
    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 returned JSON_ERROR_SYNTAX

    • Bart
      Bart about 11 years
      Check the content of $_POST["JSONfullInfoArray"]. If something doesn't parse json_code will just return null. Also use json_last_error() to try and find what went wrong.
    • UltraInstinct
      UltraInstinct about 11 years
      A 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
      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
      Chris Rae about 9 years
      The answer in here worked for me (and all the other 'answers' below didn't!).
    • Anish
      Anish about 9 years
      Thanks man. Your solution works great!
  • Bayu
    Bayu over 7 years
    I am not sure why htmlspecialchars() must there. It will convert the quote character ( " ) to " which is mean can't be processed by json_decode(). I am sure JSON format must be something like {"key":"value"}, but by using htmlspecialchars() it will convert to {"key":"value"} how come json_decode() processing it?
  • Albion S.
    Albion S. about 7 years
    I also had to use urldecode on PHP for it to work properly.
  • Aurovrata
    Aurovrata almost 7 years
    As @Albion points out, the string needs to be URI decoded before json_decode is invoked. json_decode(urldecode($_POST["JSONfullInfoArray"]));
  • treyBake
    treyBake over 6 years
    worth noting in wp I used the above with stripslashes within the html_entity_decode to make work :
  • MarkSkayff
    MarkSkayff over 5 years
    Ok, 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
    Priyanka Ahire over 3 years
    Thanks 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);