从谷歌解码Json时出现问题


Trouble decoding Json from Google

好吧,我正试图从谷歌建议工具中检索一些信息。

问题是,请求后返回的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的值的错误,并声称它期望STRINGNUMBER等…: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);