duanpa2143 2013-09-28 17:32
浏览 51
已采纳

Json解码从PHP中的Google Dictionary API返回的响应

I trying to make a request to this url to get a definition of a pizza... http://www.google.com/dictionary/json?callback=a&client=p&sl=en&tl=en&q=pizza

My initial response looks like this.....

a({"query":"pizza","sourceLanguage":"en","targetLanguage":"en","primaries":[{"type":"headword","terms":[{"type":"text","text":"piz·za","language":"en","labels":[{"text":"Noun","title":"Part-of-speech"}]},{"type":"phonetic","text":"/ˈpētsə/","language":"und"},{"type":"sound","text":"http://www.gstatic.com/dictionary/static/sounds/de/0/pizza.mp3","language":"und"}],"entries":[{"type":"related","terms":[{"type":"text","text":"pizzas","language":"und","labels":[{"text":"plural"}]}]},{"type":"meaning","terms":[{"type":"text","text":"A dish of Italian origin consisting of a flat, round base of dough baked with a topping of tomato sauce and cheese, typically with added meat or vegetables","language":"en"}]}]}]},200,null) 

After trawling through the internet and similiar issues on stackovrflow (e.g. json_decode for Google Dictionary API) I use the following bit of code to clean it up before trying to decode it....

$rawdata = preg_replace("/\\\x[0-9a-f]{2}/", "", $rawdata);
$raw = explode("{",$rawdata);
unset($raw[0]);
$rawdata = implode($raw);

$raw = explode("}", $rawdata);
unset($raw[count($raw)-1]);
$rawdata = implode($raw);

$rawdata = "{". $rawdata ."}";

Which gives me the following json-looking string...

{"query":"pizza","sourceLanguage":"en","targetLanguage":"en","primaries":["type":"headword","terms":["type":"text","text":"piz·za","language":"en","labels":["text":"Noun","title":"Part-of-speech"],"type":"phonetic","text":"/ˈpētsə/","language":"und","type":"sound","text":"http://www.gstatic.com/dictionary/static/sounds/de/0/pizza.mp3","language":"und"],"entries":["type":"related","terms":["type":"text","text":"pizzas","language":"und","labels":["text":"plural"]],"type":"meaning","terms":["type":"text","text":"A dish of Italian origin consisting of a flat, round base of dough baked with a topping of tomato sauce and cheese, typically with added meat or vegetables","language":"en"]]]} 

But it still wont decode correctly and I am stumped....

I have been using this tool here http://json.parser.online.fr/ and it says... SyntaxError: Unexpected token :

I am now thinking that all my original hacking of the json response to make the decodable is just making my problem worse and that there is a probably a much better way to handle the original response.

Can anyone shed any light on my issue?

Thanks in advance :D

  • 写回答

1条回答 默认 最新

  • duanjianqu3685 2013-09-28 18:33
    关注

    I think this is a case of overcomplicating something. The regex default property of greediness makes it simple to pull out the full json body between the first and last {}.

    <?php
    
    $str = 'a({"query":"pizza","sourceLanguage":"en","targetLanguage":"en","primaries":[{"type":"headword","terms":[{"type":"text","text":"piz·za","language":"en","labels":[{"text":"Noun","title":"Part-of-speech"}]},{"type":"phonetic","text":"/ˈpētsə/","language":"und"},{"type":"sound","text":"http://www.gstatic.com/dictionary/static/sounds/de/0/pizza.mp3","language":"und"}],"entries":[{"type":"related","terms":[{"type":"text","text":"pizzas","language":"und","labels":[{"text":"plural"}]}]},{"type":"meaning","terms":[{"type":"text","text":"A dish of Italian origin consisting of a flat, round base of dough baked with a topping of tomato sauce and cheese, typically with added meat or vegetables","language":"en"}]}]}]},200,null)';
    
    if (preg_match('/\{.*\}/', $str, $matches)) {
            $json = json_decode($matches[0], true);
            var_dump($json);
    }
    

    Returns you:

    array(4) {
      ["query"]=>
      string(5) "pizza"
      ["sourceLanguage"]=>
      string(2) "en"
      ["targetLanguage"]=>
      string(2) "en"
      ["primaries"]=>
      array(1) {
        [0]=>
        array(3) {
          ["type"]=>
          string(8) "headword"
          ["terms"]=>
          array(3) {
            [0]=>
            array(4) {
              ["type"]=>
              string(4) "text"
              ["text"]=>
              string(9) "piz·za"
              ["language"]=>
              string(2) "en"
              ["labels"]=>
              array(1) {
                [0]=>
                array(2) {
                  ["text"]=>
                  string(4) "Noun"
                  ["title"]=>
                  string(14) "Part-of-speech"
                }
              }
            }
            [1]=>
            array(3) {
              ["type"]=>
              string(8) "phonetic"
              ["text"]=>
              string(19) "/ˈpētsə/"
              ["language"]=>
              string(3) "und"
            }
            [2]=>
            array(3) {
              ["type"]=>
              string(5) "sound"
              ["text"]=>
              string(62) "http://www.gstatic.com/dictionary/static/sounds/de/0/pizza.mp3"
              ["language"]=>
              string(3) "und"
            }
          }
          ["entries"]=>
          array(2) {
            [0]=>
            array(2) {
              ["type"]=>
              string(7) "related"
              ["terms"]=>
              array(1) {
                [0]=>
                array(4) {
                  ["type"]=>
                  string(4) "text"
                  ["text"]=>
                  string(6) "pizzas"
                  ["language"]=>
                  string(3) "und"
                  ["labels"]=>
                  array(1) {
                    [0]=>
                    array(1) {
                      ["text"]=>
                      string(6) "plural"
                    }
                  }
                }
              }
            }
            [1]=>
            array(2) {
              ["type"]=>
              string(7) "meaning"
              ["terms"]=>
              array(1) {
                [0]=>
                array(3) {
                  ["type"]=>
                  string(4) "text"
                  ["text"]=>
                  string(155) "A dish of Italian origin consisting of a flat, round base of dough baked with a topping of tomato sauce and cheese, typically with added meat or vegetables"
                  ["language"]=>
                  string(2) "en"
                }
              }
            }
          }
        }
      }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 微信小程序 用oss下载 aliyun-oss-sdk-6.18.0.min client报错
  • ¥15 ArcGIS批量裁剪
  • ¥15 labview程序设计
  • ¥15 为什么在配置Linux系统的时候执行脚本总是出现E: Failed to fetch http:L/cn.archive.ubuntu.com
  • ¥15 Cloudreve保存用户组存储空间大小时报错
  • ¥15 伪标签为什么不能作为弱监督语义分割的结果?
  • ¥15 编一个判断一个区间范围内的数字的个位数的立方和是否等于其本身的程序在输入第1组数据后卡住了(语言-c语言)
  • ¥15 Mac版Fiddler Everywhere4.0.1提示强制更新
  • ¥15 android 集成sentry上报时报错。
  • ¥15 抖音看过的视频,缓存在哪个文件