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 返回空值