javascript - JSON.parse 无效字符与有效 JSON?

标签 javascript php json

所以,我有一个对象,其属性中也包含 json 字符串。序列化该对象时,这是我得到的字符串:

[{
    "template": 1,
    "action_json": "{\"id\":\"1\",\"action\":\"An action for all of IT!\",\"date_agreed\":\"2018-08-10\",\"complete_by\":\"2018-08-31\",\"responsible_departments\":[\"8\"],\"responsible_employees\":[\"1629\",\"112\",\"1374\"],\"priority\":\"High\"}",
    "template_json": "{\"columns\":[{\"id\":\"id\",\"title\":\"Task Number\",\"default\":true,\"type\":\"auto\"},{\"id\":\"action\",\"title\":\"Action Agreed\",\"default\":true,\"type\":\"longtext\"},{\"id\":\"date_agreed\",\"title\":\"Date Agreed\",\"default\":true,\"type\":\"date\"},{\"id\":\"complete_by\",\"title\":\"Complete By\",\"default\":true,\"type\":\"date\"},{\"id\":\"responsible_departments\",\"title\":\"Responsible Departments\",\"default\":true,\"type\":\"option\"},{\"id\":\"responsible_employees\",\"title\":\"Responsible Employees\",\"default\":true,\"type\":\"option\"},{\"id\":\"priority\",\"title\":\"Priority\",\"default\":true,\"type\":\"option\",\"options\":[\"High\",\"Medium\",\"Low\"]}]}"
}, {
    "template": 1,
    "action_json": "{\"id\":\"1\",\"action\":\"Action numero uno\",\"date_agreed\":\"2018-08-10\",\"complete_by\":\"2018-08-10\",\"responsible_departments\":[\"8\"],\"responsible_employees\":[\"112\"],\"priority\":\"High\"}",
    "template_json": "{\"columns\":[{\"id\":\"id\",\"title\":\"Task Number\",\"default\":true,\"type\":\"auto\"},{\"id\":\"action\",\"title\":\"Action Agreed\",\"default\":true,\"type\":\"longtext\"},{\"id\":\"date_agreed\",\"title\":\"Date Agreed\",\"default\":true,\"type\":\"date\"},{\"id\":\"complete_by\",\"title\":\"Complete By\",\"default\":true,\"type\":\"date\"},{\"id\":\"responsible_departments\",\"title\":\"Responsible Departments\",\"default\":true,\"type\":\"option\"},{\"id\":\"responsible_employees\",\"title\":\"Responsible Employees\",\"default\":true,\"type\":\"option\"},{\"id\":\"priority\",\"title\":\"Priority\",\"default\":true,\"type\":\"option\",\"options\":[\"High\",\"Medium\",\"Low\"]}]}"
}]

这很好,这是有效的 JSON。

当我尝试通过解析此字符串(使用 PHP)创建 JavaScript 对象时,出现问题:

echo "<script>
    var employeeActions = JSON.parse('".json_encode($employeeActions)."');
</script>";

然后我得到:

JSON.parse Error: Invalid character at position:33

在页面加载后检查页面时,以下是通过我的 PHP 脚本回显的内容:

<script>
    var employeeActions = JSON.parse('[{"template":1,"action_json":"{\"id\":\"1\",\"action\":\"An action for all of IT!\",\"date_agreed\":\"2018-08-10\",\"complete_by\":\"2018-08-31\",\"responsible_departments\":[\"8\"],\"responsible_employees\":[\"1629\",\"112\",\"1374\"],\"priority\":\"High\"}","template_json":"{\"columns\":[{\"id\":\"id\",\"title\":\"Task Number\",\"default\":true,\"type\":\"auto\"},{\"id\":\"action\",\"title\":\"Action Agreed\",\"default\":true,\"type\":\"longtext\"},{\"id\":\"date_agreed\",\"title\":\"Date Agreed\",\"default\":true,\"type\":\"date\"},{\"id\":\"complete_by\",\"title\":\"Complete By\",\"default\":true,\"type\":\"date\"},{\"id\":\"responsible_departments\",\"title\":\"Responsible Departments\",\"default\":true,\"type\":\"option\"},{\"id\":\"responsible_employees\",\"title\":\"Responsible Employees\",\"default\":true,\"type\":\"option\"},{\"id\":\"priority\",\"title\":\"Priority\",\"default\":true,\"type\":\"option\",\"options\":[\"High\",\"Medium\",\"Low\"]}]}"},{"template":1,"action_json":"{\"id\":\"1\",\"action\":\"Action numero uno\",\"date_agreed\":\"2018-08-10\",\"complete_by\":\"2018-08-10\",\"responsible_departments\":[\"8\"],\"responsible_employees\":[\"112\"],\"priority\":\"High\"}","template_json":"{\"columns\":[{\"id\":\"id\",\"title\":\"Task Number\",\"default\":true,\"type\":\"auto\"},{\"id\":\"action\",\"title\":\"Action Agreed\",\"default\":true,\"type\":\"longtext\"},{\"id\":\"date_agreed\",\"title\":\"Date Agreed\",\"default\":true,\"type\":\"date\"},{\"id\":\"complete_by\",\"title\":\"Complete By\",\"default\":true,\"type\":\"date\"},{\"id\":\"responsible_departments\",\"title\":\"Responsible Departments\",\"default\":true,\"type\":\"option\"},{\"id\":\"responsible_employees\",\"title\":\"Responsible Employees\",\"default\":true,\"type\":\"option\"},{\"id\":\"priority\",\"title\":\"Priority\",\"default\":true,\"type\":\"option\",\"options\":[\"High\",\"Medium\",\"Low\"]}]}"}]');
</script>

最佳答案

json_encode 输出的文本将先通过 JavaScript 字符串文字解析器,然后再通过 JSON.parse

由于 JSON 和 JS 字符串文字使用相同的转义字符,这会破坏它!您正在将 ' 字符和数据混合起来,尝试以编程方式构造 JS 字符串文字,但数据包含在 JS 中具有特殊含义的字符。

"{\"i

显示字符 33。JS 字符串文字 \" 将被解析,在字符串中放入未转义的 "

忘记使用JSON.parse。忘记尝试将 JSON 传递到浏览器。请记住,JSON 和 JavaScript 文字语法或多或少是相同的:

<script>
var employeeActions = <?php echo json_encode($employeeActions); ?>;
</script>

关于javascript - JSON.parse 无效字符与有效 JSON?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51784866/

相关文章:

javascript - LocalStorage函数插入、编辑Json

javascript - jQuery UI sortable() 方法不起作用

javascript - jQuery Ajax 上传文件 php 即使没有内容也会接收数组

PHP 和 jQuery : show/hide div if user logged in or not

javascript - 在 React.JS 中将映射函数嵌套在映射函数中

java - 如何获取 JSON 格式的 Apache Kafka 指标

php - 使用 jquery 调用 PHP 函数 $.ajax 返回 json

javascript - 页面历史记录的暂停功能 向前 向后

javascript - 如何在 JavaScript 函数的单选输入控件中引用选中的值?

php - PHP Websockets服务器在256个用户后停止接受连接