- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
简直不敢相信,有数百万篇帖子涉及这个主题,但我无法让它发挥作用。
在我的 Android 应用程序中,我正在向服务器发送 volley POST 请求。此请求是一个普通的 StringRequest,它包含一个序列化的 json 对象。
在服务器上,POST请求中的item是这样到达的,我通过
提取了raw body数据$entityBody = file_get_contents('php://input');
=>
myjsonitem=%5B%7B%22description%22%3A%22Back%22%2C%22freeText%22%3A%22%22%2C%22isRated%22%3Atrue%2C%22priceSingle%22%3A12.0%2C%22ratingStar%22%3A4.0%7D%2C%7B%22description%22%3A%22SoronA%22%2C%22freeText%22%3A%22%22%2C%22isRated%22%3Atrue%2C%22priceSingle%22%3A3.5%2C%22ratingStar%22%3A5.0%7D%5D
如您所见,该项目在各自的 json 元素周围带有双引号,对我而言,到目前为止这似乎是正确的。
当我想通过以下方式对字符串进行 json_decode 时,问题就开始了:
$itemList = json_decode($_POST['myjsonitem'], true);
此命令返回 json_decode 错误 JSON_ERROR_SYNTAX。我不明白为什么,所以我通过以下方式将 json 写入日志:
error_log("Json String: " .$_POST['myjsonitem']);
日志中的结果显示:
Json String: [{\\"description\\":\\"Back\\",\\"freeText\\":\\"\\",\\"isRated\\":true,\\"priceSingle\\":12.0,\\"ratingStar\\":4.0},{\\"description\\":\\"SoronA\\",\\"freeText\\":\\"\\",\\"isRated\\":true,\\"priceSingle\\":3.5,\\"ratingStar\\":4.0}]
如您所见,双引号前添加了双反斜杠。将此字符串放入 JSON 验证器会返回无效的 json。删除双反斜杠会返回一个有效的 json。
魔术引号不是问题,因为我运行的是 php 7+。
这是怎么回事?如何正确解析 PHP?我猜只是简单地删除双反斜杠无济于事,在我的 freeText 字段中我可以有带双引号的字符串,所以在这种情况下转义应该仍然有效。
编辑:这是上下文的关键部分。也许我应该提到我在 wordpress 安装上运行它,并且在我的 php 文件的开头,我包含 wp-load.php。
if($_SERVER['REQUEST_METHOD']=='POST'){
//getting some other data from request
$dateString = $_POST['date'];
$date = date('Y-m-d H:i:s', strtotime($dateString));
$userId = intval($_POST['userId']);
$sentUniqueId = $_POST['uniqueId'];
//crucial part goes here:
$itemsList = json_decode($_POST['myjsonitem'], true);
//output
error_log("Json String: " .$itemsList);
我发布的输出(带有双反斜杠的输出)在我的 error_log 文件中。
最佳答案
我终于找到了答案。最重要的是:我试图在 Wordpress 上下文中运行此 php 代码。 Deep down in the Wordpress function reference I found this:
WordPress adds slashes to $_POST/$_GET/$_REQUEST/$_COOKIE regardless of what get_magic_quotes_gpc() returns. So in the context of WordPress, stripslashes() or stipslashes_deep() should always be used when using those variables.
好的,现在解决方案很简单:
$my_value = stripslashes($_POST['myjsonitem']);
$itemsList = json_decode($my_value, true);
它删除了转义 json 元素双引号的斜杠,但没有删除相应文本字符串中的斜杠,这正是我所需要的。
关于PHP 在 $_POST ['myjsonitem' ] 时添加双反斜杠,导致 json_decode 结果为 JSON_ERROR_SYNTAX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52687213/
我是一名优秀的程序员,十分优秀!