javascript - "Fixing"来自 MySQL 的 JSON

标签 javascript php mysql json

我正在获取存储在 MySQL 中的 JSON 代码,它有额外的斜杠,在将其打印到页面上后,我必须将其删除,以便在 JavaScript 中解析它。现在我正在做以下事情:

$save = str_replace("\n", "<br>", $save); // Replace new line characters with <br>
$save = str_replace('\\"', '"', $save); // top-level JSON
$save = str_replace('\\\\"', '\"', $save); // HTML inside top level JSON
$save = str_replace('\\\\\\\\\\"', '\\\\\"', $save); // HTML inside second level JSON

下面是一个来自 MySQL 的 JSON 代码示例:

{\"id\":2335,\"editor\":{\"selected_shape\":\"spot-7488\"},\"general\":{\"name\":\"HTML Test\",\"shortcode\":\"html-test\",\"width\":1280,\"height\":776},\"spots\":[{\"id\":\"spot-7488\",\"x\":9.9,\"y\":22.6,\"default_style\":{\"use_icon\":1},\"tooltip_content\":{\"content_type\":\"content-builder\",\"plain_text\":\"<p class=\\\"test\\\">Test</p>\",\"squares_json\":\"{\\\"containers\\\":[{\\\"id\\\":\\\"sq-container-293021\\\",\\\"settings\\\":{\\\"elements\\\":[{\\\"settings\\\":{\\\"name\\\":\\\"Paragraph\\\",\\\"iconClass\\\":\\\"fa fa-paragraph\\\"},\\\"options\\\":{\\\"text\\\":{\\\"text\\\":\\\"<p class=\\\\\\\"test\\\\\\\">Test</p>\\\"}}}]}}]}\"}}]}

为了正确解析它应该是这样的(使用 jsonlint.com 进行测试):

{"id":2335,"editor":{"selected_shape":"spot-7488"},"general":{"name":"HTML Test","shortcode":"html-test","width":1280,"height":776},"spots":[{"id":"spot-7488","x":9.9,"y":22.6,"default_style":{"use_icon":1},"tooltip_content":{"content_type":"content-builder","plain_text":"<p class=\"test\">Test</p>","squares_json":"{\"containers\":[{\"id\":\"sq-container-293021\",\"settings\":{\"elements\":[{\"settings\":{\"name\":\"Paragraph\",\"iconClass\":\"fa fa-paragraph\"},\"options\":{\"text\":{\"text\":\"<p class=\\\"test\\\">Test</p>\"}}}]}}]}"}}]}

请注意,我在 JSON 中有 HTML 代码,而该代码又在另一个 JSON 中,这就是它变得有点困惑的地方。

我的问题 - 是否有一个适用于 PHP 的函数或库(对于 JS 也可以)涵盖所有这些极端情况,因为我确信有人会找到一种方法来破坏脚本。

谢谢!

最佳答案

简短的答案是严重不足的,供您使用 stripslashes 。这个答案不充分的原因是您的 JSON 字符串可能已转义或多次addslashes调用它,并且您每次都必须精确地调用 stripslashes 一次这已经发生了。

正确的解决方案是找出添加斜杠的位置,并且 a) 避免添加斜杠或 b) 了解斜杠为何存在并做出相应响应。我坚信创建损坏的 JSON 的过程就是问题所在。

在某些情况下,PHP 中通常会添加斜杠:

  • magic_quotes已打开。这是一个旧的 PHP 功能,已被删除。基本思想是 PHP 过去常常自动转义传入请求中的引号,以便您将传入字符串塞入数据库中。你猜怎么了? 不安全。

  • add_slashes已被调用。为什么叫这个?有些人在将数据放入数据库之前将其用作转义数据的错误方法。其他人使用它来防止 HTML 在回显变量时被破坏(可能应该使用 htmlspecialchars)。当您在字符串中定义代码时,它还可以在各种其他情况下派上用场。

  • 转义数据输入时。最常见的转义函数是 mysqli_real_escape_string 。在将值插入数据库之前对它们进行转义非常重要,以防止 SQL 注入(inject)和其他漏洞利用,但永远不应该转义两次。

所以有可能你的代码是双重转义的东西或者addslashes被调用或者像magic_quotes这样的东西导致了问题,但我怀疑这是另一个问题:一些JS代码可能不提供这个JSON作为一个正确的 JSON 字符串,但已被转义,以便在 javascript 中定义一个字符串。

如果您采用上面的示例 JSON 字符串,并在其周围加上一些引号:

var myJSON = "<put your string here>";

那么惊讶你的 JavaScript 没有被破坏,并且 var myJSON 包含一个实际上是有效 JSON 的字符串,并且可以解析为有效的 JSON 对象:

var myJSON = "{\"id\":2335,\"editor\":{\"selected_shape\":\"spot-7488\"},\"general\":{\"name\":\"HTML Test\",\"shortcode\":\"html-test\",\"width\":1280,\"height\":776},\"spots\":[{\"id\":\"spot-7488\",\"x\":9.9,\"y\":22.6,\"default_style\":{\"use_icon\":1},\"tooltip_content\":{\"content_type\":\"content-builder\",\"plain_text\":\"<p class=\\\"test\\\">Test</p>\",\"squares_json\":\"{\\\"containers\\\":[{\\\"id\\\":\\\"sq-container-293021\\\",\\\"settings\\\":{\\\"elements\\\":[{\\\"settings\\\":{\\\"name\\\":\\\"Paragraph\\\",\\\"iconClass\\\":\\\"fa fa-paragraph\\\"},\\\"options\\\":{\\\"text\\\":{\\\"text\\\":\\\"<p class=\\\\\\\"test\\\\\\\">Test</p>\\\"}}}]}}]}\"}}]}";
console.log(JSON.parse(myJSON)); // this is an actual object

这里的关键是检查此 JSON 到达系统的入口点。我怀疑某些 AJAX 请求创建了某个对象,但它不是发送该对象的有效 JSON,而是发送 JSON 对象的转义字符串。

编辑:

这是一个简单的示例,说明当编码过多时会发生什么情况。尝试在浏览器中运行此 JS 并观察控制台输出:

var myObj = {"key":"here is my value"};
console.log(myObj);
var myJSON = JSON.stringify(myObj);
console.log(myJSON);
var doubleEncoded = JSON.stringify(myJSON);
console.log(doubleEncoded);

关于javascript - "Fixing"来自 MySQL 的 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41653280/

相关文章:

php - 为 Mac 安装 ext-zip

Mysql范围选择

javascript - 使用 laravel 从 php 发送变量到 javascript 的最佳方法

php - OOP 设计问题 - 避免在类似的类中重复代码?

php - 为什么我可以在 XAMPP 中使用 PHP 连接到 MySQL 服务器,但不能连接到 Uniform Server?

MySql 搜索排名标准

javascript - 如何在SCSS + Parcel.js中使用背景图像

javascript - 阅读 Fetch Promise 的正文

javascript - Angular 更新表单填充输入字段,但仍然在控制台中返回错误?

javascript - 你可以在 ionic Android 和 iOS 应用程序中使用 webRTC 吗?