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

しかし、この出力をこれに編集する必要があります (3 つのレート (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 に答える
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 に答える