json在POST后返回空值

Posted

技术标签:

【中文标题】json在POST后返回空值【英文标题】:json return null value after POST 【发布时间】:2013-07-09 09:12:33 【问题描述】:

a.php

$(document).ready(function() 
    $("#submit_form").on("click",function()
        var json_hist =  <?php echo $json_history; ?>;
        $.ajax(
            type: "POST",
            url: "b.php",
            data: "hist_json="+JSON.stringify(json_hist),
            //contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function(data)alert(data);,
            failure: function(errMsg) 
                alert(errMsg);
            
        );  
    ); 
)

b.php

$obj=json_decode($_POST["hist_json"]);
var_dump($_POST);

如果我评论 contentType: "application/json; charset=utf-8" 一切正常,但如果取消注释。 var 转储将返回 null。

【问题讨论】:

无需在php文件中提供json_decode 你为什么使用 dataType: "json" ?尝试删除它,因为 b.php 的输出不是 json 谢谢,但即使我没有在 php 文件中解码。它在 var 转储中返回 null。 "$history = json_encode($pro_hist);" “var json = ;”我已经编码为 json 类型。但是为什么我不需要使用数据类型 json 呢?谢谢 【参考方案1】:

当您在 ajax 中设置 contentType 时,您设置的是请求而不是响应的 contentType。

JSON contentType 失败,因为您发送的数据是键/值格式的数据(缺少编码),因此数据与 contentType 不匹配。 JSON contentType 标头适用于您发送没有标识符的原始 JSON,但在您的情况下,您有一个标识符 hist_json=

我建议改为:

data:  hist_json : JSON.stringify(json_hist) ,

使用带有hits_json 键的对象意味着jQuery 将安全地URL encode JSON 并允许PHP 使用$_POST['hits_json'] 来获取它。


如果您想使用 JSON contentType,那么您必须将 ajax 更改为:

data:  JSON.stringify(json_hist) , // <-- no identifier

和 PHP:

$obj = json_decode($HTTP_RAW_POST_DATA);
var_dump($obj);

【讨论】:

data: hits_json:JSON.stringify(json_hist), contentType: "application/json; charset=utf-8", dataType: "json", 在firebug中,post数据 hits_json=% 7B%22history_done_task%22%3A150%2C%22history_morale%22%3A150%2C%22history_date%22%3A150%2C%22history_skill_lv%22%3A150%7D 和 b.php var 转储返回 null。请帮忙 不,您使用的是 hist_json 标识符,因此不要包含 JSON contentType。想用header看答案,需要改ajax和php。 是不是每次发送json都没有设置内容类型?我想学习最正确的方法。再次感谢您的帮助 正确,不要发送 contentType,因为您的数据不完全是 JSON。 看我回答的第二部分。要发送纯 JSON,您需要删除 hist_json 标识符,并更改 PHP 代码。【参考方案2】:

据我所知,这是在 FireFox 中出现的错误。

你可以在http://bugs.jquery.com/ticket/13758阅读更多内容

*** 里也有关于它的话题

Cannot set content-type to 'application/json' in jQuery.ajax

【讨论】:

【参考方案3】:

您已注释掉的行试图将Content-type: 标头更改为application/json。虽然您发送的数据是 JSON 格式,但数据是作为 HTTP POST 请求传输的,因此您需要使用默认的内容类型 application/x-www-form-urlencoded;。这就是为什么它可以在删除线的情况下工作。

【讨论】:

是不是说最正确的发送json的方式不需要设置内容类型了? 对于你在这里尝试做的事情,不要设置内容类型。 在什么情况下我应该设置内容类型?谢谢 如果您尝试使用 Ajax 上传多个文件,您可能需要明确设置内容类型。我想不出您需要将其设置为application/json 的场合。当然,您可能希望为从服务器接收的数据设置dataType

以上是关于json在POST后返回空值的主要内容,如果未能解决你的问题,请参考以下文章

RestSharp:从结果中获取空值。调试结果时的数据虽然返回了 JSON

在 Swift iOS 中解码的 PHP JSON 返回空值

json_decode 从 iOS 应用程序返回空值

全局变量在不同视图控制器中使用时返回空值

对数组内容使用了json_encode返回汉字内容返回了空值

Android - Jackson JSON 解析器在“发布”版本中返回空值