为什么 json_encode 之后的 JSON.parse 不起作用?

2024-02-27

为什么这对我不起作用?

<script>
JSON.parse(<?php echo json_encode(array('test123', 'test456')); ?>);
</script>

我收到此错误:

SyntaxError: JSON.parse: unexpected non-whitespace character after JSON data


PHP's json_encode生成一个字符串,但它是内存中的实际字符串,而不是 PHP 语法中的字符串,因此当它不包含在引号中时echo编辑。当回显到 JavaScript 代码的上下文中时,它会打印完全有效的 JSON,但 JS 解释器不会将其视为字符串,因为它没有用引号引起来。如果没有它们,JS 就会看到一个用文字语法表示的数组(因为 JSON 从 JS 文字语法的子集中借用了自己的语法)。因此,尝试解析它会引发错误。

如果您的代码运行,这就是输出源中实际显示的内容:

<script>
var obj = ["test123", "test456"];
</script>

As obj现在保存一个数组(用 JS 文字语法表示),运行它JSON.parse会导致错误。

可以将其想象为您在 PHP 中用字符串编写的句子,然后进行回显:

<?php
$sentence = 'I like beer.':
echo $sentence;
?>

这将产生输出:

I like beer.

注意没有引号。现在,想象一下“手动”编写一段 JSON 并回显它:

<?php
$json = '{"foo": "bar"}':
echo $json;
?>

这将输出:

{"foo": "bar"}

再次注意,没有引号。对变量的赋值$json在 PHP 中生成与调用相同的字符串数据json_encode。因此,回显调用的输出也会导致没有引号。

现在,看看最后一个输出块——如果 JavaScript 引擎遇到类似的情况,它会做什么?

所以,要解析JSON.parse,你需要一些 JS 在 JS 引擎解析期间将解释为字符串的东西。如果您将 PHP 用单引号括起来,如下所示:

<script>
var obj = '<?php echo json_encode(array('test123', 'test456')); ?>';
</script>

那么输出将是:

<script>
var obj = '["test123", "test456"]';
</script>

由于这是一个格式正确的字符串,因此现在它是 JSON 并且可以传递给JSON.parse.

(Note:不过,简单地用单引号括起来并不安全,因为 PHP 编码的结构可能有一个字符串,其中包含单引号。这会导致 JavaScript 中出现语法错误。)

正如已经提到的,这些都不是必需的——您可以将未引用的 JSON 交给 JS 并跳过解析,因为 JS 解释器将按原样解析它并为您节省一步。我只是想让你了解其中的机制。希望我没有让你感到困惑...:(

JavaScript 是唯一一种将 JSON 直接输出到上下文中的语言,这使得它不再是字符串,实际上可以产生可行的东西。这是因为 JSON 语法借鉴了 JavaScript 文字语法的子集。

上下文就是一切。例如,通过 AJAX 向 JavaScript 发送 JSON 与您尝试向 JavaScript 提供一些 JSON 时显示的上下文不同。对于 AJAX,服务器对 AJAX 代码的响应已经是内存中的 JS 字符串。而 PHP 回显到 JS 代码中会产生供 JS 引擎解析的语法,因此需要引号才能使其成为字符串。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 json_encode 之后的 JSON.parse 不起作用? 的相关文章

  • 预加载 javascript 和 css 文件

    我目前正在开发一个移动网站 该网站大量使用图像 CSS 和 JavaScript 例如 它使用未压缩的 150KB 的库 我为图像构建了一个预加载器 效果相当好 function loadImages images var sum 0 fo
  • dc lineChart 单击时弹出数据点信息

    我正在尝试检测折线图数据点上的点击 Per this answer dc scatter plot binding onClick event https stackoverflow com a 22772340 1873386 I am
  • 如何检查侧边栏视图是否已经在主干中渲染?

    通常 用户通过主页进入网站 然后我在那里渲染侧边栏视图 接下来 用户单击链接 路由器呈现另一个视图并替换原始内容视图 侧边栏视图不会重新渲染 当用户在子页面上单击刷新时 侧边栏不会呈现 如何检查视图是否存在并且已渲染 划分责任并坚持下去 不
  • 获取输入图像类型选择的图片并加载到图像标签中

    所以 我有一个用于上传 img 文件的输入框 我想要做的是从该数据 或选定的源 中获取数据并将其路由到图像标签的 src 属性中 像这样的东西 http jsfiddle net QC2c4 http jsfiddle net QC2c4
  • UpdatePanel 启动脚本未执行

    我正在编写一个在 SharePoint 网站中使用的 ASP NET Web 部件 并尝试使用 UpdatePanel 来呈现查询结果 我想使用 JQuery 插件来修改从异步回发返回的表 但我无法让启动脚本在异步更新上执行 我发现这个帖子
  • PHP strtotime +1 个月添加额外一个月[重复]

    这个问题在这里已经有答案了 我有一个简单的变量 可以将今天添加一个月 endOfCycle date Y m strtotime 1 month 今天是 2013 年 1 月 所以我希望返回 2013 02 但我得到的是 2013 03 我
  • Jquery 子元素发生变化

    我正在尝试使用 jquery 在子元素 在本例中为 select 更改时触发事件 这是我的 HTML div class row addForm div class col lg 2 col md 2 col sm 3 col xs 6 d
  • Firefox 上的 jquery 焦点未设置

    我想将焦点设置到我的文本区域 以下是我的代码 this textInput val show focus 但它不起作用 实际上 当我按下鼠标按钮时 它会出现 但是当我松开鼠标时 它会从文本区域中删除 因此 经过大量搜索后 我发现 setTi
  • 带有桌子的嵌套表

    我在应用了表排序器的表中嵌套了表 它在嵌套表中添加了排序标题 但是它们没有对行进行排序 并且抛出了JavaScript错误 我想拥有 嵌套表不可排序 巢表上的排序实际上可以工作 但不是现状 您的第一个选择要容易得多 使嵌套表不可排序 像这样
  • 如何处理 setTimeout() 的多个实例?

    阻止创建 setTimeout 函数的多个实例 在 JavaScript 中 的最推荐 最佳方法是什么 一个例子 伪代码 function mouseClick moveDiv div 0001 mouseX mouseY function
  • 如果突出显示一个单词并且用户单击连接单词,则同时突出显示两个单词

    我最近发布了一个question https stackoverflow com questions 34963610 how can i highlight a word term quicker and smarter寻求一种更智能地突
  • Intern JS - 如何在链式 Command 方法中使用 Promise.all()?

    我是用 Intern JS 编写测试的新手 并且一直在遵循他们的文档来使用对象接口 https theintern github io intern interface object and 页面对象 https theintern git
  • Kendo 刷新 (DropDownList.refresh()) 不起作用错误未定义

    我试图在另一个 DropDownList 更改后刷新下拉列表 但 Refresh 方法未定义错误正在升级 我尝试再次读取数据源 它显示它正在加载 但数据仍然相同 帮助解决这个问题请 Code DropDownList1 change fun
  • 为什么我从 c# 到 js 得到不同的 MD5 哈希值?

    我有一个用于加密密码的 C 函数 System Security Cryptography MD5CryptoServiceProvider md5Provider new System Security Cryptography MD5C
  • 如何使 4.X Typescript 项目与旧版本的 Typescript(如 3.X)兼容?

    如何使基于 TS 4 X 构建的软件包与 3 X 兼容 例如 如果我有较新的版本 则使用新功能 否则使用any or unknown或旧版本支持的任何内容 有没有可能使用指令 https www typescriptlang org doc
  • Symfony错误在链配置的命名空间XXX中找不到类XXX

    关于这个主题已经有一些其他问题 但没有一个真正有帮助 我是 Symfony 的新手 所以很难理解它 我在文件 Client IntranetBundle LDAP LDAPAuthenticationProvider php 中 此代码导致
  • redux - 如何存储和更新键/值对

    我正在使用 redux 和 React js 我想存储简单的键 值对 但无法获得正确的减速器语法 在这种情况下 每个键 值对将保持与外部系统的连接 这是正确的做法吗 我刚开始使用 redux 所以这有点神秘 export default s
  • React Router Tabs——保持组件安装

    我使用 React Router 创建了选项卡 每个选项卡都有不同的路线 但是 我想通过保持隐藏选项卡的安装来维护选项卡转换之间的选项卡状态 我该如何实现这一目标 每次路由切换时 React 路由器都会重新安装每个组件 已经有人问过这个问题
  • 将 JSON 发送到 Spring MVC 控制器

    我正在尝试将 JSON 发送到 Spring MVC 控制器 在 Spring MVC 方面 一切都配置正确 下面是代码 但似乎没有运行
  • 文件和目录条目 API 在 Chrome 中损坏?

    我正在尝试使用文件和目录条目 API 创建一个文件上传器工具 该工具允许我将文件和目录的任意组合放入浏览器窗口中 以供读取和上传 我完全意识到 可以通过使用文件输入元素来实现类似的功能webkitdirectory已启用 但我正在测试一个用

随机推荐

  • 按键时的 JTable 编辑

    我正在尝试以编程方式开始编辑当前行的第三列JTable在按键上 我已经实现了一个 KeyListener 其中keyReleased 包含这段代码 if e getKeyCode KeyEvent VK ENTER myTab change
  • 在 Powershell 中优雅地停止

    How do I catch and handle Ctrl C in a PowerShell script I understand that I can do this from a cmdlet in v2 by including
  • JVM 何时抛出 OutOfMemoryError

    我们正在运行一个有时会 冻结 的 Java 应用程序 因为某些线程正在使用几乎所有堆 尽管 JVM 执行的 Full GC 持续了 60 秒以上 但应用程序从未因 OutOfMemoryError 错误而终止 我从 Java 文档中读到 如
  • amqp 与 amqplib - 哪个 Node.js amqp 客户端库更好?

    这些 amqp 客户端库之间有什么区别 哪一款最值得推荐 主要区别是什么 我会推荐amqp node https github com squaremo amqp node and bramqp https github com bakke
  • Json.Net 没有以相同的方式序列化小数两次

    我正在测试我正在处理的购物车的 Json NET 序列化 并注意到当我序列化 gt 反序列化 gt 再次序列化时 我发现某些文件的尾随零格式有所不同decimal字段 这是序列化代码 private static void TestRoun
  • 检测 Excel 设置的语言并将其显示在文件的单元格中

    我正在设计一组它们之间相关的相关Excel文件 目标是引用彼此文档的宏可以在任何给定的计算机 路径中工作 因此 我使用了一组相对路径 使宏能够正常工作 我使用了以下功能 CELDA nombrearchivo A 1 nombredearc
  • UIPasteboard 字符串从 Today 扩展返回 null

    似乎在 iOS 9 Xcode 7 beta 5 中 我无法访问 UIPasteboard generalPasteboard string 来自我的 今日 小部件扩展 因为每次无论内容如何 它都会返回 NULL 我浏览了发行说明 但没有看
  • PHP ftp_put 返回“无法建立数据连接:连接被拒绝”

    我有一台通过 PHP 运行一些 FTP 的 PC 我知道它在 1 2 个月前还可以工作 但现在我返回它 发现该 PC 不再工作了 我知道我一直在使用电脑 但我想不出可能会发生什么变化 PHP 抛出错误消息读取 无法建立数据连接 连接被拒绝
  • 本机 PHP 5.6 OpenSSL Composer.phar 无法在 Windows 上启用加密

    我在 Windows 计算机上使用本机 PHP 5 6 时遇到问题 当我尝试运行 Composer 更新 php Composer phar update 时出现此错误 Composer Downloader TransportExcept
  • Google OAuth2 集成错误 400:redirect_uri_mismatch

    我收到这个错误Error 400 redirect uri mismatch即使在给出正确的重定向 uri 之后 您可以查看下面的图片以供参考 它适用于我的本地主机 但它在我的服务器上显示此错误 我的域名看起来像https xxx topL
  • Golang - “go run main.go”和编译之间的区别

    在用 Go 编写了一些脚本之后 我问自己 编译一个 go file 以及稍后的执行和go run FILE go在性能等方面的命令 如果我使用这些方法之一启动 Web 服务有什么优势吗 go run只是一步编译然后运行的快捷方式 虽然它对开
  • 绝对位置和溢出:隐藏

    div div div div 我需要显示比父元素大的子元素 但不删除 Overflow hidden 这可能吗 父元素有position relative 子元素一旦超出其父元素的边界 就会被删除 元素定义了额外的 css 为了清晰起见
  • C++ const 强制转换,不确定这是否安全

    这似乎是一个愚蠢的问题 但我确实需要澄清这一点 这会给我的程序带来任何危险吗 Is the const cast甚至需要 如果我更改输入指针值 它将安全地工作std string或者它会产生未定义的行为 到目前为止 唯一担心的是 每当我修改
  • 具有一个视频轨道和多个音频轨道的 AVPlayer

    我试图让我的应用程序中的播放器能够拥有一个视频轨道和多个音频轨道 针对不同的语言 我已经这样做了 但播放器无法启动 AVMutableComposition composition AVMutableComposition composit
  • 我无法列出 Raspberry Pi 附近的 BLE 设备(python、btmgmt)

    我想通过使用 cron 脚本调用的 python 脚本来扫描 Raspberry 环境中的 ble 设备 但是当我在 cron 中执行此操作时 我的意思是我添加到 sudo crontab e 我总是得到一个空列表 当我以 pi 用户身份登
  • GDB:列出崩溃进程的所有映射内存区域

    我从 x86 Linux 机器 内核 2 6 35 22 如果重要的话 上的死进程中获得了全堆核心转储 我正在尝试在 GDB 中对其进行调试 是否有一个我可以使用的 GDB 命令 意思是 显示该进程分配的所有内存地址区域的列表 换句话说 我
  • 在 Golang 中构建动态(条件)WHERE SQL 查询

    我正在使用 golang go reform PostgreSQL 我想做的是一个 REST 搜索实用程序 一切都很顺利 直到我遇到条件搜索查询 这里的 条件 意味着我在表中有 10 列要搜索 并且可能有大量的组合 所以我无法单独处理它们
  • 使用联合类型进行类型推断 - 不存在最佳通用类型

    所以 我正在使用 TypeScript 进行类型推断 我将提供两个示例 它们在调用时会产生相同的结果 但是在其中一个示例中 由于 没有最佳常见类型 TypeScript 无法推断类型 三元运算符的示例 function foo a bool
  • Symfony 2:如何在控制器外部或服务中渲染模板?

    如何在控制器外部或服务中渲染模板 我一直在关注 Symfony2 的文档 Doc http symfony com doc current book service container html core symfony and third
  • 为什么 json_encode 之后的 JSON.parse 不起作用?

    为什么这对我不起作用 我收到此错误 SyntaxError JSON parse unexpected non whitespace character after JSON data PHP s json encode生成一个字符串 但它