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

L'output è:Modifica risposta JSON dalla risposta ricciolo

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

ma ho bisogno di modificare questa uscita a questo (solo con tre tariffe (AED/AFN/AOA)). Quindi, modifica la risposta JSON nella sezione delle tariffe. Come lo posso fare?

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

Perché si usa 'json_encode' di' json_decode'? –

+0

secondo parametro di 'json_encode();' è un flag, non un booleano (true). Forse intendevi impostare true in 'json_decode();' e restituire un array associato. –

+0

@TamasPap La risposta $ è una stringa. Ho bisogno prima di json_encode. –

risposta

3

Il $response non è nel formato corretto json:

è necessario rimuovere le parti non necessarie da esso:

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

Si può fare:

<?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

la risposta è un formato JSON valido. [link] (http://openexchangerates.org/api/latest.json?app_id=5bf388eb6f7e40209b9418e6be44f04b&callback=angular.callbacks._0) –

+0

No, non lo è. Si ottiene una stringa lunga da "openexchangerates', you' json_encode' quindi si 'json_decode' it.In realtà hai lo stesso 'string' in' data'. Crea un 'var_dump' se non mi credi :) –

+1

Il json valido si trova tra' angular.callbacks._0 ('e' '' alla fine. Devi analizzare questa parte. –

1

leggere la stringa JSON in una matrice di mappatura PHP con json_decode, scegliere solo gli elementi necessari, comporre un nuovo array con loro e, infine, nuovamente serializzare con json_encode.

Nota: questo metodo è più robusto di un regex/stringa basato su uno, in quanto ha senso di ciò che viene elaborato, consentendo così la mutazione nella struttura del JSON, purché gli elementi di cui hai bisogno siano a loro posti.

Per la selezione di elementi, utilizzare:

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

"scegli solo gli elementi di cui hai bisogno": come? –

+0

Mi correggo per il filtraggio: vedere la risposta modificata –

3

Restituisce una risposta per jsonp. Ne avresti bisogno sul lato client, ma non sul server. Potresti provare:

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

(ad esempio, omettere la richiamata). Altrimenti dai un'occhiata alla loro API per vedere se puoi formattare la richiesta in modo diverso per ricevere puro JSON senza il callback.

Se è assolutamente non può, allora si può solo togliere le parti cattive:

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

volta che hai la valida JSON, si tratta di una semplice questione di unset ting:

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

Potresti anche scrivere il contenuto di cui hai bisogno su un altro oggetto se è più semplice.

Si consiglia di dare un'occhiata all'API per vedere se è possibile ottenere solo tariffe specifiche indietro.