0

さて、Google Suggest ツールから情報を取得しようとしています。

問題は、リクエストの後に返された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', '}'

PSのように編集した後でも"e":、値に関するエラーが発生し、またはなどuを期待していると主張しています... :SSTRINGNUMBER

4

3 に答える 3

1

質問で指定されたコードは、有効な JSONではありません。

有効な JSON であるためには、フィールドの名前を引用符で囲む必要があります。e変数名やその他の名前を引用符で囲むことはできません。

これは、JSON デコーダーが不平を言っていること"e"ですe

さらに、JSON は\xエスケープ形式 (16 進数の文字参照) を受け入れません。\uフォーマット (10 進数の Unicode 文字参照)のみを使用できます。あなたが提供したコードには、両方の形式のエスケープ文字が含まれています。

問題は、公式の Google API を使用しているかどうかです。通常、有効な JSON を提供するのが得意だからです。これは有効な JSON ではないため、正しい API を使用していない可能性があります。もう 1 つの手がかりは、変数名があまり意味がないことです。公式の API は通常、より意味のある変数名を付けます。それが正しい API である場合は、Google にチケットを発行して修正する必要があります。壊れた JSON は良くありませんが、修正するのはかなり簡単なはずです。

それらを修正してもらうことができず、有効なデータを提供する代替の API の場所が見つからないと仮定すると、取得したものをどのように処理すればよいでしょうか?

このコードは有効な JSON ではないかもしれませんが、Javascript オブジェクトとしては有効です (JSON ルールはプレーンな Javascript よりも厳密です)。したがって、eval()十分に信頼できる場合は、を使用して Javascript インタープリターで実行できます。

他の唯一の代替手段は、変数名が引用符で囲まれるように、解析する前に文字列を修正することです。これは少し面倒ですが、出力が一貫していれば実行可能です。ただし、それが変更された場合は問題が発生します (また、非公式の API の場合、警告なしにいつでも発生する可能性があります)。

于 2013-08-08T13:18:20.697 に答える
0

問題はbackslashes、文字列 (エスケープ文字に使用) にあります。

PHP 5.4 では、以下を使用できますJSON_UNESCAPED_SLASHES

echo json_encode(JSON_STRING, JSON_UNESCAPED_SLASHES);

それ以外の場合は、交換を行うことができます-

str_replace('\\/', '/', json_encode(JSON_STRING));

\/は有効な表現方法であるため/

于 2013-08-08T12:27:26.827 に答える
0

OK、これが私がやったことです(まったくエレガントではありませんが、機能します):

    $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);
于 2013-08-08T13:26:36.297 に答える