0

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

5
  • In you request, you're asking for a 'callback=a'. The result you're getting is jsonp object. as you can see, the json object is inside of an function 'a'. This function 'a' is a callback, that google is returning to you with the json object. For example, open your console (F12 in chrome and firefox) and write there: 'function a(json) { console.log(json)l };' and then put the response and you'll see the object Commented Sep 28, 2013 at 17:40
  • I rather probably incorrectly assumed that by removing call back parts that what would be left over is just the json... Commented Sep 28, 2013 at 17:43
  • Yes, that would be true. Unfortunately at present you are removing required pieces of the json body. In particular, where you have arrays [] and you have json objects inside [{"foo": "bar", "foo2": "bar2" }] you are stripping out the {}. You need to fix your regex so that it doesn't invalidate the json. Commented Sep 28, 2013 at 17:48
  • The json seems fine to me. You're removing the padding correctly. After searching a bit, I've found this article: timelessrepo.com/json-isnt-a-javascript-subset I think its explains it all. Btw, try to send query without callback=a, maybe you won't have to remove the padding :) Commented Sep 28, 2013 at 17:51
  • @MichaelArenzon The original json is fine... it's his extraction code that is broken. Commented Sep 28, 2013 at 18:14

1 Answer 1

1

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"
            }
          }
        }
      }
    }
  }
}
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.