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

Die Ausgabe lautet:bearbeiten json Antwort von curl Antwort

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

Aber ich brauche diesen Ausgang dieses zu bearbeiten (nur mit drei Raten (AED/AFN/AOA)). Bearbeiten Sie also im Grunde die JSON-Antwort im Abschnitt Raten. Wie kann ich das machen?

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

Warum machen Sie 'json_encode' als' json_decode'? –

+0

zweiter Parameter von 'json_encode();' ist ein Flag, kein Boolean (true). Vielleicht wollten Sie dies in 'json_decode();' setzen und ein assoziatives Array zurückgeben. –

+0

@TamasPap Die $ Antwort ist eine Zeichenkette. Ich brauche zuerst den json_encode. –

Antwort

3

Die $response ist nicht in der richtigen json Format:

Sie müssen die nicht benötigten Teile davon entfernen:

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

Sie tun können:

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

die Antwort ist ein gültiges JSON-Format. [link] (http://openexcharates.org/api/latest.json?app_id=5bf388eb6f7e40209b9418e6be44f04b&callback=angular.callbacks._0) –

+0

Nein, ist es nicht. Sie erhalten eine lange Zeichenfolge von 'openexcharates', Sie' json_encode' es dann Sie 'json_decode' es.Sie haben tatsächlich die gleiche 'string' in' data'. Mache einen 'var_dump', wenn du mir nicht glaubst :) –

+1

Der gültige JSON steht zwischen' angular.callbacks._0 ('und' '' '' '' ') am Ende. Sie müssen diesen Teil analysieren. –

1

die JSON-String in eine PHP-Mapping Array Lesen mit json_decode, nehmen nur die Elemente, die Sie benötigen, komponieren mit ihnen ein neues Array und es schließlich mit json_encode neu serialisieren.

Hinweis: Diese Methode ist robuster als eine Regex/String-basierte, da sie Sinn macht, was es verarbeitet wird, so dass Mutation in der Struktur der JSON ermöglicht, solange die Elemente, die Sie benötigen setzt.

Für Elemente der Auswahl verwenden:

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

"Wählen Sie nur die Elemente, die Sie brauchen": Wie? –

+0

Ich korrigiere mich selbst über Filterung: siehe die bearbeitete Antwort –

3

Es gibt eine Antwort für Jsonp. Sie würden das auf der Client-Seite benötigen, aber nicht auf dem Server. Sie könnten versuchen:

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

(d. H. Den Rückruf weglassen). Andernfalls sehen Sie sich ihre API an, um zu sehen, ob Sie die Anfrage anders formatieren können, um pure JSON ohne Rückruf zu empfangen.

Wenn Sie absolut nicht, dann können Sie nur die schlechten Teile abstreifen:

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

Sobald Sie die gültige JSON haben, ist es einfach eine Frage der unset ting:

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

Sie könnten auch einfach den Inhalt schreiben, den Sie brauchen, wenn es einfacher ist.

Sie können sich die API ansehen, um zu sehen, ob Sie nur spezifische Preise zurückbekommen.