I’m trying to access data on the internet via an AJAX and using PHP. I’ve managed to access to data, however, it is JSON encoded. I want to decode the results.
PHP File:
$executionStartTime = microtime(true) / 1000; // build the individual requests, but do not execute them $ch_1 = curl_init('http://api.geonames.org/countryInfoJSON?formatted=true&lang=en&country='. $_REQUEST['iso'].'&username=PRIVATE&style=full'); $ch_2 = curl_init('https://restcountries.eu/rest/v2/alpha/'.$_REQUEST['iso']); $ch_3 = curl_init('https://openexchangerates.org/api/latest.json?app_id=PRIVATE'); curl_setopt($ch_1, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch_2, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch_3, CURLOPT_RETURNTRANSFER, true); // build the multi-curl handle, adding both $ch $mh = curl_multi_init(); curl_multi_add_handle($mh, $ch_1); curl_multi_add_handle($mh, $ch_2); curl_multi_add_handle($mh, $ch_3); // execute all queries simultaneously, and continue when all are complete $running = null; do { curl_multi_exec($mh, $running); } while ($running); //close the handles curl_multi_remove_handle($mh, $ch_1); curl_multi_remove_handle($mh, $ch_2); curl_multi_remove_handle($mh, $ch_3); curl_multi_close($mh); // all of our requests are done, we can now access the results $geoNames = curl_multi_getcontent($ch_1); $restCountries = curl_multi_getcontent($ch_2); $openExchange = curl_multi_getcontent($ch_3); // Final Output $output['status']['code'] = "200"; $output['status']['name'] = "OK"; $output['geoNames'] = $geoNames; $output['restCountries'] = $restCountries; $output['openExchange'] = $openExchange; $output['status']['returnedIn'] = (microtime(true) - $executionStartTime) / 1000000 . " ms"; header('Content-Type: application/json; charset=UTF-8'); echo json_encode($output);
If you replace ‘json_encode($output)’ with ‘json_decode($output)’ or just ‘$output’ doesn’t work as it returns null with console.log().
JavaScript File:
function getInfo() { getCountryBorder(); $.ajax({ type: 'POST', url: 'libs/php/getInfo.php', data: { country: 'United Kingdom', iso: 'GB', }, dataType: 'json', success: function (result) { console.log(result); } }) }
Data Returned is JSON encoded:
{status: {…}, geoNames: "{"geonames": [{↵ "continent": "EU",↵ "capital": …inentName": "Europe",↵ "currencyCode": "GBP"↵, "country": "United%20Kingdom"}]}", restCountries: "", openExchange: "", @@@…}
Desired Data Formatting is JSON decoded:
{status: {…}, geoNames: {"continent": "EU", "capital": continentName": "Europe", "currencyCode": "GBP"}, etc.}
Advertisement
Answer
The Final Output should be
// Final Output $output['status']['code'] = "200"; $output['status']['name'] = "OK"; $output['geoNames'] = json_decode($geoNames, true); $output['restCountries'] = json_decode($restCountries, true); $output['openExchange'] = json_decode($openExchange, true);
The response from the remote api server is STRING json and we need to decode it before marge it to array