Read associative array from json in $_POST

2020-01-30 07:17发布

I am using jQuery to post a json object to my php application.

jQuery.post("save.php",JSON.stringify(dataToSend), function(data){ alert(data); });

The json string as pulled from firebug looks like this

{ "data" : [ { "contents" : "This is some content",
        "selector" : "DIV.subhead"
      },
      { "contents" : "some other content",
        "selector" : "LI:nth-child(1) A"
      }
    ],
  "page" : "about_us.php"
}

In php I am trying to turn this into an associative array.

My php code so far is

<?php
$value = json_decode(stripcslashes($_POST));
echo $value['page'];
?>

The response to the ajax call should be "about_us.php" but it comes back blank.

6条回答
再贱就再见
2楼-- · 2020-01-30 07:28

Pass the second argument as true if you want the associative array otherwise it will keep returning object.

$value = json_decode(stripslashes($_POST),true);
查看更多
smile是对你的礼貌
3楼-- · 2020-01-30 07:43

It looks like jQuery might encode a javascript object in urlencoded form then would be populated into $_POST. At least from their examples. I'd try passing in your object into post() without stringifying it.

查看更多
Summer. ? 凉城
4楼-- · 2020-01-30 07:45

If you want to use json data as an associative array, you can try as following:

<?php 

$json = 'json_data'; // json data

$obj = jsondecode($json, true); // decode json as associative array 

// now you can use different values as 
echo $obj['json_string']; // will print page value as 'about_us.php' 


for example: 

$json = { "data" : [ { "contents" : "This is some content",
    "selector" : "DIV.subhead"
   },
   { "contents" : "some other content",
    "selector" : "LI:nth-child(1) A"
   }
  ],
"page" : "about_us.php"
}

$obj = json_decode($json, true); 

/* now to print contents from data */

echo $obj['data']['contents']; 
 // thats all 
?>
查看更多
Ridiculous、
5楼-- · 2020-01-30 07:46

Try:

echo $value->page;

since json_decode's default behaviour is to return an object of type stdClass.

Alternatively, set the second optional $assoc argument to true:

$value = json_decode(stripslashes($_POST), true);
echo $value['page'];
查看更多
可以哭但决不认输i
6楼-- · 2020-01-30 07:52

You can avoid to use JSON.stringify and json_decode:

jQuery.post("save.php", dataToSend, function(data){ alert(data); });

And:

<?php
echo $_POST['page'];
?>

Update:

... but if your really want to use them, then:

jQuery.post("save.php",  {json: JSON.stringify(dataToSend)}, function(data){ alert(data); });

And:

<?php
$value = json_decode($_POST['json']);
echo $value->page;
?>
查看更多
你好瞎i
7楼-- · 2020-01-30 07:52

$_POST will not be populated if the request body is not in the standard urlencoded form.

Instead, read from the read-only php://input stream like this to get the raw request body:

$value = json_decode(file_get_contents('php://input'));
查看更多
登录 后发表回答