关于javascript:如何通过jquery ajax post数据在PHP中编码JSON?

How do I encode JSON in PHP via jQuery Ajax post data?

我有一个HTML表单,并在点击提交按钮时将数据发送到PHP文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$.ajax({
    url:"text.php",
    type:"POST",
    data: {
        amount: amount,
        firstName: firstName,
        lastName: lastName,
        email: email
    },
    dataType:"JSON",
    success: function (data) {
        console.log("ok");
        $("#result").text(data);
    }
});

在PHP中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
    $amount      = $_POST["amount"];
    $firstName   = $_POST["firstName"];
    $lastName    = $_POST["lastName"];
    $email       = $_POST["email"];
    if(isset($amount)){
        $data = array(
           "amount"     => $amount,
           "firstName"  => $firstName,
           "lastName"   => $lastName,
           "email"      => $email
        );
        echo json_encode($data);
    }
?>

结果是[对象对象]。我想要一个像这样的类型:

1
{"Amount":"12.34","FirstName":"Any","LastName":"Tester","Email":"[email protected]"}

我做错了什么?


使用json.stringify的代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<html>
    <head>
       jQuery Test
       <script type="text/javascript" src="http://code.jquery.com/jquery-1.9.1.js">
       <script type="text/javascript">
           $(document).ready(function() {
               $("#submit").click(function(){
                   $.ajax({
                       url:"text.php",
                       type:"POST",
                       data: {
                           amount: $("#amount").val(),
                           firstName: $("#firstName").val(),
                           lastName: $("#lastName").val(),
                           email: $("#email").val()
                       },
                       dataType:"JSON",
                       success: function (jsonStr) {
                           $("#result").text(JSON.stringify(jsonStr));
                       }
                   });
               });
           });
       
    </head>

    <body>
       
        <form name="contact" id="contact" method="post">
            Amount: <input type="text" name="amount" id="amount"/><br/>
            firstName: <input type="text" name="firstName" id="firstName"/><br/>
            lastName: <input type="text" name="lastName" id="lastName"/><br/>
            email: <input type="text" name="email" id="email"/><br/>
            <input type="button" value="Get It!" name="submit" id="submit"/>
        </form>
    </body>
</html>

文本文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
    $amount      = $_POST["amount"];
    $firstName   = $_POST["firstName"];
    $lastName    = $_POST["lastName"];
    $email       = $_POST["email"];
    if(isset($amount)){
        $data = array(
           "amount"     => $amount,
           "firstName"  => $firstName,
           "lastName"   => $lastName,
           "email"      => $email
        );
        echo json_encode($data);
    }
?>

您的对象很可能被正确传递。正如@spudley所解释的那样,您捕获结果的方式返回[object object]。控制台不知道如何显示构造,但您可以使用object.attribute语法显示特定的属性。在JS端使用console.log()或下面的代码进行预处理输出。

1
2
3
// Indent with tabs
// Data is the parameter sent to the success function in the ajax handler
JSON.stringify( data , null, '\t');

如何在(unix)shell脚本中漂亮地打印JSON?

如果您发现某个地方有错误,还可以临时删除Ajax处理程序上的dataType。让输出在GET请求上显示应该可以。对于修改诸如数据库删除或更改之类的操作,请将此更改回POST。

最后,修改头部,如@groovycarot's answer所示。如果您使用的是chrome,那么额外的空白空间似乎是一个bug:tab,并在chrome中预先包装了JSON输出。


尝试添加

1
header('Content-type: application/json');

在你的PHP脚本的顶部,看看你能得到什么。

希望有帮助!

编辑:忘记提到你应该访问你的值,比如:data.amount


不能将JSON对象直接插入到DOM中。JSON对象toString()方法总是给U[对象对象对象],这就是为什么您要得到这个。您必须使用或者你必须运行$.each(data,function(val){ $("#result").append(val) })


您正在将结果对象转换为字符串,而不是显示它。

如果希望打印对象位于某个包装器中,则可以执行以下操作,而不是结果:

1
2
3
4
5
6
7
8
9
10
11
var text = '{';

for(var i in data) {
  var value = data[i];

  text += '"'+i+'":"'+value+'", ';
}

text += '}';

$('#result').text(text);

但您可能会认为,以JSON格式查看响应的方法console.log更容易、更快。