从 JSON 编码的字符串中删除键上的双引号。

4

我有一个被json_encode编码过的数组,它很好用。

我需要在从函数调用返回json字符串时去掉所有键上的双引号。

我该如何实现并成功返回它?

谢谢!

非常抱歉,这里是json代码片段:

{"start_date":"2011-01-01 09:00","end_date":"2011-01-01 10:00","text":"test"}

补充一些信息:

我将通过AJAX请求检索JSON数据,如果有更简便的方法,我也可以考虑在JavaScript端如何实现。


2
你能展示一下JSON代码的例子吗? - Ignas
2
如果你去掉它们,那么它就不再是JSON了。你为什么觉得需要这样做呢? - Quentin
1
我相信JSON标准规定所有元素必须被双引号包围? - afuzzyllama
我需要这样做(即使违反了JSON标准),是因为我使用的应用程序无法正确解析JSON,必须按照我所解释的方式进行:/ - DarkMantis
1
不要破坏数据,修复解析器。 - Quentin
2个回答

7

EDITED as per anubhava's comment

$str = '{"start_date":"2011-01-01 09:00","end_date":"2011-01-01 10:00","text":"test"}';
$str = preg_replace('/"([^"]+)"\s*:\s*/', '$1:', $str);
echo $str;

对于上述字符串,这种方法肯定是有效的,尽管可能存在一些边缘情况,我还没有考虑到这些情况,这种方法是否适合您的目的取决于字符串格式以及它包含的元素/值的静态程度。


不错,但我认为 preg_replace('/"([^"]+)"\s*:\s*/', '$1:', $str) 可能会更安全一些。 - anubhava
我收到了一个异常:preg_replace():未找到结束定界符'/' - Jake Wilson

0

TL;DR:缺少引号是Chrome显示它是JSON对象而不是字符串的方式。确保在PHP的AJAX响应中有Header('Content-Type: application/json; charset=UTF8'),以解决真正的问题。

详细信息: 想要解决这个问题的一个常见原因是在调试返回的AJAX数据时发现了这种差异。

在我的情况下,我使用Chrome的调试工具看到了这种差异。当连接到旧系统时,在成功后,根据调试器,Chrome显示响应中的键周围没有引号。这使得该对象可以立即被视为一个对象,而无需使用JSON.parse()调用。在调试我的新AJAX目标时,响应中显示了引号,变量是一个字符串而不是一个对象。
当我在外部测试AJAX响应并看到旧系统实际上确实在键周围加了引号时,我最终意识到了真正的问题。这不是Chrome开发工具显示的内容。 唯一的区别是在旧系统上有一个指定内容类型的头文件。我将其添加到新的(WordPress)系统中,现在调用与原始脚本完全兼容,成功函数可以处理响应作为对象,无需任何解析。现在我可以在旧系统和新系统之间切换,除了目标URL之外不需要进行任何更改。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接