2

I'm trying to POST some JSON data to be processed by PHP. When it arrives on the server-side, the data is escaped and I can't reliably unescape it.

    var jsondata = '{"name":"Foo","email":"name@address.com"},{"name":"Bar","email":"name@address.com"}';
    $.ajax({
        type: "POST",
        url: "save.php",
        dataType: "json",
        processData: false,
        data: { json: '['+jsondata+']'},
    });

$_POST['json'] then contains:

[{\"name\":\"Foo\",\"email\":\"name@address.com\"},{\"name\":\"Foo\",\"email\":\"name@address.com\"}]

How can I send unencoded JSON post-data? I thought processData: false would cover that.


To illustrate the error server-side:

<?php

$_POST['json-bad'] = '[{\"name\":\"Foo\",\"email\":\"name@address.com\"},{\"name\":\"Foo\",\"email\":\"name@address.com\"}]';
$data_bad = json_decode($_POST['json-bad']);
var_dump($data_bad); // returns "NULL"

$_POST['json-good'] = '[{"name":"Foo","email":"name@address.com"},{"name":"Bar","email":"name@address.com"}]';
$data_good = json_decode($_POST['json-good']);
var_dump($data_good); // returns array as expected

?>
4

3 回答 3

0

JSON(JavaScript 对象表示法)只是以 javascript 格式表达对象的方式。

我的印象是您只需将一个对象从 javascript 传递到您的服务器。

在这种情况下,您不需要进行任何特定的操作

persons = {"name":"Foo","email":"name@address.com"},{"name":"Bar","email":"name@address.com"};
$.ajax({
    type: "POST",
    url: "save.php",
    dataType: "json",
    processData: false,
    data: {'persons': persons},
});

在服务器端

echo $_POST['persons'][0]['name'];

你会得到

Foo

这不是你想要做的吗?

于 2012-11-05T15:38:05.430 回答
0

如果您的数据来自表单,您将需要使用下面的一些代码,如果不是全部的话。此代码采用 jquery 表单对象,并将stringify其以适当的方式进行,您可以轻松地执行类似的操作

$json = json_decode($_POST['json'], true); 
echo $json['email'];

这是JS

$.ajax({
    type: "POST",
    url: "save.php",
    dataType: "json", //NOTE: indicates data type being RETURNED, not PASSED
    processData: false,
    data: { json: getJson( $('#formId') )} //NOTE: REMOVE THIS EXTRA COMMA
});


function getJson(o){
    return (JSON.stringify(o.serializeObject()));   
}
$.fn.serializeObject = function(){
    var o = {};
    var a = this.serializeArray();
    $.each(a, function() {
        if (o[this.name]) {
            if (!o[this.name].push) {
                o[this.name] = [o[this.name]];
            }
            o[this.name].push(this.value || '');
        } else {
            o[this.name] = this.value || '';
        }
    });
    return o;
};  

注意:旧版浏览器要求您包含json2.js此处找到的库:http ://www.crockford.com/javascript/jsmin.html

于 2012-11-05T15:17:38.163 回答
0

你不能只使用json_decode吗?

于 2012-11-05T14:40:02.470 回答