好吧,我正试图从谷歌建议工具中检索一些信息。
问题是,请求后返回的json似乎不可解码(使用json_decode
)+JSONLint将其视为"无效"。
怎么了?
{
e: "GooDUs7lFIeXO63LgBA",
c: 0,
u: "https://www.google.com/s?gs_rn'x3d24'x26gs_ri'x3dpsy-ab'x26tok'x3dt8ORbtI13MEFLoCQjPSv6w'x26cp'x3d2'x26gs_id'x3d3i'x26xhr'x3dt'x26q'x3dtemplate'x26es_nrs'x3dtrue'x26pf'x3dp'x26safe'x3doff'x26sclient'x3dpsy-ab'x26oq'x3d'x26gs_l'x3d'x26pbx'x3d1'x26bav'x3don.2,or.r_cp.r_qf.'x26bvm'x3dbv.50500085,d.bGE'x26fp'x3dc513cf9c63a02102'x26biw'x3d1304'x26bih'x3d437'x26tch'x3d1'x26ech'x3d20'x26psi'x3dFYkDUs-xCsrT4QTD9YGwDw.1375963413783.1",
p: true,
d: "['x22template'x22,[['x22template''u003cb''u003es''u003c''/b''u003e'x22,0],['x22template''u003cb''u003e monster''u003c''/b''u003e'x22,0],['x22template''u003cb''u003e c++''u003c''/b''u003e'x22,0],['x22template''u003cb''u003es for pages''u003c''/b''u003e'x22,0]],{'x22t'x22:{'x22bpc'x22:false,'x22tlw'x22:false},'x22q'x22:'x22YjrI_EdhVrEkZrkqZwaGIJ_Ih4c'x22,'x22j'x22:'x223i'x22}]"
}
这就是JSONLint给出的错误:
Parse error on line 1:
{ e: "GooDUs7lFIeXO63L
-----^
Expecting 'STRING', '}'
p.S.即使像"e":
等编辑它之后,它仍然会给出关于u
的值的错误,并声称它期望STRING
或NUMBER
等…:S
问题中给出的代码不是有效的JSON。
为了成为有效的JSON,需要将字段用引号命名。e
变量名或其他任何变量名周围都没有引号。
这就是JSON解码器所抱怨的:它期望看到"e"
,而不是e
。
此外,JSON不接受'x
转义格式(十六进制字符引用);它只能使用CCD_ 10格式(十进制的unicode字符引用)。您提供的代码包括两种格式的转义字符。
问题是,你在使用官方的谷歌API吗?因为他们通常非常擅长提供有效的JSON。这不是有效的JSON,所以可能是您没有使用正确的API。另一条线索是,变量名的意义不大;官方API通常会给出更有意义的变量名。如果它是正确的API,你应该试着用谷歌来解决它;损坏的JSON并不好,但对他们来说,修复它应该很简单。
假设您无法让他们修复它,并且我们找不到提供有效数据的替代API位置,我们如何处理我们所拥有的?
虽然此代码可能不是有效的JSON,但它作为Javascript对象是有效的(JSON规则比普通Javascript规则更严格)。因此,如果您对此足够信任的话,它可以在使用eval()
的Javascript解释器中运行。
唯一的另一种选择是在解析字符串之前修复字符串,以便引用变量名。这有点痛苦,但如果输出一致,那也是可以的。然而,如果它发生变化,你会遇到问题(同样,如果它是一个非官方的API,这可能在没有警告的情况下随时发生)。
问题出在字符串(用于转义字符)中的backslashes
在PHP 5.4中,您可以使用JSON_UNESCAPED_SLASHES
:
echo json_encode(JSON_STRING, JSON_UNESCAPED_SLASHES);
否则,您可以进行更换-
str_replace('''/', '/', json_encode(JSON_STRING));
由于'/
是表示/
的有效方式
好吧,这就是我最终要做的(一点也不优雅,但它很有效):
$content = preg_replace_callback(
"(''''x([0-9a-f]{2}))i",
function($a) {return chr(hexdec($a[1]));},
$content
);
$content = str_replace("e:","'"e'":",$content);
$content = str_replace("c:","'"c'":",$content);
$content = str_replace("u:","'"u'":",$content);
$content = str_replace("p:","'"p'":",$content);
$content = str_replace("d:","'"d'":",$content);
$content = str_replace("'"[","[",$content);
$content = str_replace("]'"","]",$content);
$content = json_decode($content);