2013-05-09 17 views
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); 

出力は次のようになります。編集JSONレスポンスは

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)との)この1に、この出力を編集する必要があります。したがって、基本的にレートのセクションでjsonの応答を編集します。どうやってやるの?

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

なぜ 'json_encode'を' json_decode'よりもやっているのですか? –

+0

'json_encode();'の第2引数はフラグでありブール値ではありません(真)。おそらく、あなたは 'json_decode();'でそれをtrueに設定し、assoc配列を返すことを意図していました。 –

+0

@TamasPap $応答は文字列です。私はまずjson_encodeが必要です。 –

答えて

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); 
+0

を参照してください。応答は有効なjson形式です。 [リンク](http://openexchangerates.org/api/latest.json?app_id=5bf388eb6f7e40209b9418e6be44f04b&callback=angular.callbacks._0) –

+0

いいえ、それはありません。あなたは 'openexchangerates'から長い文字列を取得し、' json_encode'を 'json_decode'します。あなたは実際に 'data'に同じ' string'を持っています。あなたが私を信じていないなら 'var_dump'を作ってください:) –

+1

有効なjsonは、最後から' angular.callbacks._0( 'と') 'の間にあります。この部分を解析する必要があります。 –

1

json_decodeでPHPマッピング配列にJSON文字列を読んで、あなたが必要な要素だけを選んで、彼らと新しい配列を構成し、最終的にjson_encodeでそれを再シリアライズ。

注:このメソッドは、正規表現/文字列ベースのものよりも堅牢です。処理される内容を理解するため、必要な要素がJSONの構造内にある限り、JSONの構造に突然変異を許します。場所。

要素を選択するために、使用:

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

"必要な要素だけを選んでください":どのように? –

+0

私はフィルタリングで自分自身を訂正しました。編集された回答 –

3

これはjsonpの応答を返します。クライアント側では必要ですが、サーバー側では必要ありません。試してみてください:

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

(つまり、コールバックを省略してください)。それ以外の場合は、APIを参照して、純粋な JSONをコールバックなしで受信するようにリクエストを異なる形式でフォーマットできるかどうかを確認してください。

あなたは絶対に、そしてあなただけの悪い部分を取り除くことができますすることができない場合:有効なJSONを持っていたら

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

は、それがunsetティンの簡単な問題です:

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

他のオブジェクトに必要なコンテンツを簡単に書き込むこともできます。

特定のレートのみを戻すことができるかどうかについては、APIをご覧ください。

関連する問題