我有一个被json_encode编码过的数组,它很好用。
我需要在从函数调用返回json字符串时去掉所有键上的双引号。
我该如何实现并成功返回它?
谢谢!
非常抱歉,这里是json代码片段:
{"start_date":"2011-01-01 09:00","end_date":"2011-01-01 10:00","text":"test"}
补充一些信息:
我将通过AJAX请求检索JSON数据,如果有更简便的方法,我也可以考虑在JavaScript端如何实现。
我有一个被json_encode编码过的数组,它很好用。
我需要在从函数调用返回json字符串时去掉所有键上的双引号。
我该如何实现并成功返回它?
谢谢!
非常抱歉,这里是json代码片段:
{"start_date":"2011-01-01 09:00","end_date":"2011-01-01 10:00","text":"test"}
补充一些信息:
我将通过AJAX请求检索JSON数据,如果有更简便的方法,我也可以考虑在JavaScript端如何实现。
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)
可能会更安全一些。 - anubhavapreg_replace():未找到结束定界符'/'
- Jake WilsonTL;DR:缺少引号是Chrome显示它是JSON对象而不是字符串的方式。确保在PHP的AJAX响应中有Header('Content-Type: application/json; charset=UTF8'),以解决真正的问题。
详细信息: 想要解决这个问题的一个常见原因是在调试返回的AJAX数据时发现了这种差异。
在我的情况下,我使用Chrome的调试工具看到了这种差异。当连接到旧系统时,在成功后,根据调试器,Chrome显示响应中的键周围没有引号。这使得该对象可以立即被视为一个对象,而无需使用JSON.parse()调用。在调试我的新AJAX目标时,响应中显示了引号,变量是一个字符串而不是一个对象。
当我在外部测试AJAX响应并看到旧系统实际上确实在键周围加了引号时,我最终意识到了真正的问题。这不是Chrome开发工具显示的内容。
唯一的区别是在旧系统上有一个指定内容类型的头文件。我将其添加到新的(WordPress)系统中,现在调用与原始脚本完全兼容,成功函数可以处理响应作为对象,无需任何解析。现在我可以在旧系统和新系统之间切换,除了目标URL之外不需要进行任何更改。