6
<?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);

输出是:

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
    }
})

但我需要将此输出编辑为这个(仅具有三个速率(AED/AFN/AOA))。因此,基本上在费率部分编辑 json 响应。我怎样才能做到这一点?

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

3 回答 3

3

格式$response不正确:json

您必须从中删除不必要的部分:

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

你可以做:

<?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);  
于 2013-05-09T22:50:45.053 回答
3

它正在返回对 jsonp 的响应。您需要在客户端,而不是服务器。你可以试试:

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

(即省略回调)。否则,请查看他们的 API,看看您是否可以以不同的方式格式化请求以在没有回调的情况下接收纯JSON。

如果你绝对不能,那么你可以去掉坏的部分:

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

一旦有了有效的 JSON,就很简单了unset

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

如果更容易,您也可以将所需的内容写入其他对象。

您可能想查看 API 以查看是否只能返回特定费率。

于 2013-05-09T23:13:36.093 回答
1

用 将 JSON 字符串读入 PHP 映射数组json_decode,只选择您需要的元素,用它们组成一个新数组,最后用 重新序列化它json_encode

注意:此方法比基于正则表达式/字符串的方法更健壮,因为它可以理解正在处理的内容,从而允许 JSON 结构中的突变,只要您需要的元素在它们的位置。

要选择元素,请使用:

$keep = array("AED", "AFN", "AOA");
$data["rates"] = array_intersect_key($data["rates"], array_flip($keep));
于 2013-05-09T22:33:08.383 回答