为了账号安全,请及时绑定邮箱和手机立即绑定

来自php json_encode的数据的javascript parse.json错误

来自php json_encode的数据的javascript parse.json错误

PHP
波斯汪 2021-12-03 19:18:37
我在将数据从 PHP 发送到 Javascript 时遇到了一个非常棘手的问题。长话短说...我从数据库中获取一些数据,然后将所有数据都转换为 json 并将所有数据发送到一个 javascript 函数。数据库中的一列包含如下所示的数据:val01\test\val04我将这些数据分配给一个数组,然后使用 json_encode 将所有内容转换为 json,如下例所示:$result = 'val01\test\val04'; //these are the data that are get from DB$example = ['testData' => $result];json_encode($example);最后我有这些数据:{"testData":"val01\\test\\val04\\"}现在,当我像这样将这些结果与 parse.json 一起使用时:var json = '{"testData":"val01\\test\\val04\\"}';obj = JSON.parse(json);我收到一个错误:Error: Unexpected token v in JSON at position 24似乎斜线被错误地转义了......确保这不是我的错......我也在MDN示例页面(https://developer.mozilla.org/it/docs/Web/JavaScript)上测试了我的例子/Reference/Global_Objects/JSON/parse ) 返回相同的结果。我怎么解决这个问题?我不会创建自己的转义函数..从我的角度来看太危险了..我永远不知道我会在这个列中找到什么样的数据所以..有一种干净的方法来处理这个问题吗?
查看完整描述

1 回答

?
30秒到达战场

TA贡献1828条经验 获得超6个赞

你似乎在做两件事:

  1. 生成 JSON。

  2. 将此类 JSON 插入 JavaScript 字符串文字中。

请记住,JSON 不是 JavaScript。JSON 只是一种纯文本数据格式,而 JavaScript 是一种成熟的编程语言。他们经常感到困惑,因为前者的灵感来自后者的某些数据结构的语法,但这就是相似性结束的地方。

处理#1 很容易:PHP 有一个专门为它设计的函数json_encode(),根据我的经验,它坚如磐石。

然而,处理#2 并不那么简单。PHP 具有(或好或坏)转义 HTML、URL 或 SQL 中的文字数据的功能,但它从来没有真正具有在 JavaScript 字符串中完成相同工作的特定功能。

我们要编写自己的函数吗?幸运的是没有。这就是 JSON 和 JavaScript 之间的相似性可以帮助我们的地方。碰巧我们也可以json_encode()用来转义 JavaScript 字符串中的原始输入,因为 JSON 语法是 JavaScript 字符串语法的一个子集。但是... JSON 必须是一个对象或一个数组,不是吗?确实如此。幸运的是,PHP 来救援是因为:

PHP 实现了原始 RFC 7159 中指定的 JSON 超集。
[...]
与参考 JSON 编码器一样,json_encode() 将生成一个简单值的 JSON(即,既不是对象也不是数组)如果给定字符串、整数、浮点数或布尔值作为输入值。虽然大多数解码器会接受这些值作为有效的 JSON,但有些可能不会,因为规范在这一点上是模棱两可的。

来源

换句话说,json_encode()也会产生 JSON片段。所以你可以这样做:

<?php

$result = 'val01\test\val04'; //these are the data that are get from DB

$example = ['testData' => $result];

$json = json_encode($example);

$javascript = json_encode($json);

?>

<script>

var json = <?php echo $javascript; ?>;

var obj = JSON.parse(json);

</script>

其中呈现:


<script>

var json = "{\"testData\":\"val01\\\\test\\\\val04\"}"

var obj = JSON.parse(json);

</script>

并在浏览器中按预期工作一次:


var json = "{\"testData\":\"val01\\\\test\\\\val04\"}"

var obj = JSON.parse(json);

console.log(obj.testData);


如评论中所述,使用 JSON 作为代理将数据从 PHP 传递到 JavaScript 是完全多余的。请记住:JSON 语法是 JavaScript 语法的主题。这意味着任何有效的 JSON 字符串也恰好是有效的 JavaScript 对象或数组文字。在这个用例中,在 PHP 中编码两次然后在 JavaScript 中解码是没有意义的。


查看完整回答
反对 回复 2021-12-03
  • 1 回答
  • 0 关注
  • 292 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信