daniel__
daniel__

Reputation: 11845

Edit json response from curl response

<?php
$json_url = "http://openexchangerates.org/api/latest.json?app_id=xxxxx&callback=angular.callbacks._0";

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $json_url);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
$response = curl_exec($curl);

$jsonString = json_encode($response, true);
$data=json_decode($jsonString);

echo '<pre>',print_r($data),'</pre>';

$status = curl_getinfo($curl);
curl_close($curl);

The output is:

angular.callbacks._0({
    "disclaimer": "xx",
    "license": "xx",
    "timestamp": 1368136869,
    "base": "USD",
    "rates": {
        "AED": 3.672819,
        "AFN": 53.209,
        "ALL": 107.953875,
        "AOA": 96.358934,
        "ARS": 5.214887,
         ....
        "XOF": 501.659003,
        "XPF": 91.114876,
        "ZMK": 5227.108333,
        "ZMW": 5.314783,
        "ZWL": 322.387247
    }
})

But i need to edit this output to this one (only with three rates (AED/AFN/AOA)). So, basically edit the json response in the section of rates. How can i do that?

angular.callbacks._0({
    "disclaimer": "xx",
    "license": "xx",
    "timestamp": 1368136869,
    "base": "USD",
    "rates": {
        "AED": 3.672819,
        "AFN": 53.209,
        "AOA": 107.953875,
    }
})

Upvotes: 6

Views: 3561

Answers (3)

Tam&#225;s Pap
Tam&#225;s Pap

Reputation: 18303

The $response is not in correct json format:

You must remove the unnecessary parts from it:

$jsonString= substr($response, 21, -1);

You can do:

<?php
$json_url = "http://openexchangerates.org/api/latest.json?app_id=5bf388eb6f7e40209b9418e6be44f04b&callback=angular.callbacks._0";

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $json_url);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
$response = curl_exec($curl);

$jsonString= substr($response, 21, -1);
$data=json_decode($jsonString, true);

// Get the list of rates
$rates = $data['rates'];

$new_rates = array();
$new_rates['AED'] = $rates['AED'];
$new_rates['AFN'] = $rates['AFN'];
$new_rates['AOA'] = $rates['AOA'];

$data['rates'] = $new_rates;

echo 'angular.callbacks._0('.json_encode($data).')';

$status = curl_getinfo($curl);
curl_close($curl);  

Upvotes: 3

Explosion Pills
Explosion Pills

Reputation: 191779

It's returning a response for jsonp. You would need that on the client side, but not the server. You might try:

http://openexchangerates.org/api/latest.json?app_id=xxxxx

(i.e. omit the callback). Otherwise take a look at their API to see if you can format the request differently to receive pure JSON back without the callback.

If you absolutely can't, then you can just strip off the bad parts:

preg_match('/{.*}/', $response, $matches);
$json = json_decode($matches[0]);

Once you have the valid JSON, it's a simple matter of unsetting:

unset($json->rates->XOF);
//etc.

You could also just write the content you need to some other object if it's easier.

You may want to take a look at the API to see if you can get only specific rates back.

Upvotes: 3

Stefano Sanfilippo
Stefano Sanfilippo

Reputation: 33076

Read the JSON string into a PHP mapping array with json_decode, pick only the elements you need, compose a new array with them and finally reserialize it with json_encode.

Note: this method is more robust than a regex/string based one, as it makes sense of what it's being processed, thus allowing for mutation in the structure of the JSON, as long as the elements you need are at their places.

For selecting elements, use:

$keep = array("AED", "AFN", "AOA");
$data["rates"] = array_intersect_key($data["rates"], array_flip($keep));

Upvotes: 1

Related Questions