2017-07-07 3 views
0

Ich bin für eine API, um einen Client zu schreiben ...Wie dekodiert man Unicode-encoded JSON in PHP mit Zend Json Json :: decode (...)?

use Zend\Http\Client; 
use Zend\Http\Request; 
use Zend\Json\Json; 
... 
$request = new Request(); 
$request->getHeaders()->addHeaders([ 
    'Accept-Charset' => 'UTF-8', 
    'Accept' => 'application/hal+json', 
    'Content-Type' => 'application/hal+json; charset=UTF-8', 
]); 
$apiAddress = 'http://my.project.tld/categories'; 
$request->setUri($apiAddress); 
$request->setMethod('GET'); 
$client = new Client(); 
$response = $client->dispatch($request); 
$data = $response->getContent(); 

... und eine Unicode-JSON wie folgt codiert:

...{"id":"7","title":"\u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u0438","short_name":"\u0418\u041b\u041b\u042e\u0421\u0422\u0420\u0410\u0426\u0418\u0418"... 

Zuerst habe ich versucht, es zu entschlüsseln mit json_decode(...). Aber ich habe keine geeignete Methode gefunden, um dies in PHP zu tun (ohne verdächtige Regex-basierte Ansätze).

Jetzt versuche ich es mit Zend\Json\Json::decode(...) und folgende Störung zu erhalten:

/var/www/path/to/project/vendor/zendframework/zend-json/src/Json.php:243 
Decoding failed: Syntax error 

Wie ein Unicode-codierte bekommen JSON mit Zend\Json decodiert?


EDIT

gerade bemerkt, dass die JSON gebrochen ist. Es ist in zwei Teile getrennt. Die Zeichenfolge beginnt mit 1f9e, dann der erste Teil, dann die Zeichenfolge \u043, dann der zweite Inhaltsteil, dann 0.

1f9e <-- What is it? 
{"_li... 
\u043 <-- What is it? 
1a6... 
tfoli <-- What is it? 
0 
+0

Sind Sie sicher, dass das JSON gültig ist? –

+0

Ich habe es auch mit Postman getestet. Also, ja, ich denke, ich kann sicher sein, dass es gültig ist. Aber codiert. – automatix

+0

Warte, vielleicht hast du recht. Setzen Sie einfach die Ausgabe des API-Aufrufs von Postmans "hübscher" Ansicht auf die 'Json :: decode (...)' - Funktion. Dann habe ich die gleiche Ausgabe aus der "rohen" Ansicht. Ich habe erwartet, dass es nicht funktioniert. Aber tatsächlich hat es auch funktioniert. So, es scheint wirklich ein Problem mit dem JSON zu sein, das ich von 'Zend \ Http \ Response # getContent()' bekomme. – automatix

Antwort

1

Verwenden Sie Zend\Json\Decoder Komponente von ZF2. Es hat eine statische Methode namens Decoder::decodeUnicodeString(), die Unicode-Zeichen dekodiert.

Bitte sehen Sie sich das Skript here an.

Hoffe das würde dir helfen!

+0

Vielen Dank für Ihre Antwort! +1 Aber eigentlich ist das Problem in meinem Fall im gebrochenen JSON. Weitere Informationen finden Sie unter [diese Frage] (https://stackoverflow.com/q/44978260/2019043). – automatix

0

Sobald ich sehe, dass JSON scheint nicht gebrochen zu sein. Bitte beachten Sie die folgenden Codezeilen:

$data = '{"id":"7","title":"\u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u0438","short_name":"\u0418\u041b\u041b\u042e\u0421\u0422\u0420\u0410\u0426\u0418\u0418"}'; 

$json = json_decode($data); 

header('Content-Type: text/html; charset=utf-8'); 
echo $json->title; 
echo "<br/>"; 
echo $json->short_name; 

das Ergebnis:

иллюстрации 
ИЛЛЮСТРАЦИИ 
+0

Vielen Dank für Ihre Antwort, aber bitte sehen Sie die ** EDIT ** in meiner Frage und auch [diese Frage] (https://Stackoverflow.com/q/44978260/2019043), weil - Sie haben Recht - die JSON selbst ist in Ordnung, aber es kommt mit einigen zusätzlichen Symbolen am Anfang und am Ende. Der JSON zwischen diesen zusätzlichen Zeichenfolgen ist tatsächlich gültig. Aber alle zusammen ergeben eine ungültige JSON-Zeichenfolge. – automatix