Ich habe eine einfache PHP-Struktur mit 3 verschachtelten Arrays.
Ich verwende keine bestimmten Objekte und baue mir die Arrays mit 2 verschachtelten Schleifen.
Hier ist ein Beispiel für den var_dump des Arrays, das ich in Json konvertieren möchte.
array (size=2)
'tram B' =>
array (size=2)
0 =>
array (size=3)
'name' => string 'Ile Verte' (length=9)
'distance' => int 298
'stationID' => int 762
1 =>
array (size=3)
'name' => string 'La Tronche Hôpital' (length=18)
'distance' => int 425
'stationID' => int 771
16 =>
array (size=4)
0 =>
array (size=3)
'name' => string 'Bastille' (length=8)
'distance' => int 531
'stationID' => int 397
1 =>
array (size=3)
'name' => string 'Xavier Jouvin' (length=13)
'distance' => int 589
'stationID' => int 438
In einem anderen Skript habe ich eine ähnliche Struktur und json_encode
funktioniert gut. Ich verstehe also nicht, warum json_encode
hier nicht funktioniert.
Bearbeiten: Es scheint ein Problem mit der Codierung zu geben. Wenn mb_detect_encoding
ASCII zurückgegeben wird, json_encode
funktioniert dies, aber wenn UTF8 zurückgegeben wird, funktioniert es nicht mehr.
Edit2: gibt json_last_error()
zurück, JSON_ERROR_UTF8
was bedeutet: Fehlerhafte UTF-8-Zeichen, möglicherweise falsch codiert .
This function only works with UTF-8 encoded data.
dass es kein Problem mit der Codierung geben sollte.utf8_encode()
Ihrename
Array-Felder zu verwenden, bevor Sie die Zeichenfolge übergebenjson_encode()
.JSON_PARTIAL_OUTPUT_ON_ERROR
Option , um das Problem anzuzeigen (z. B. ist das Feld mit UTF8 null).Antworten:
Gut nach 2 Stunden Graben (vgl. Bearbeitungen)
Ich fand folgendes heraus:
mb_detect_encoding
Gibt wahrscheinlich eine fehlerhafte Antwort zurück, einige Zeichenfolgen waren wahrscheinlich nicht UTF-8utf8_encode()
dieser Zeichenfolge hat mein Problem gelöst, aber siehe Hinweis untenHier ist eine rekursive Funktion, die die Konvertierung aller in einem Array enthaltenen Zeichenfolgen in UTF-8 erzwingen kann:
Verwenden Sie es einfach so:
Hinweis: utf8_encode () codiert die ISO-8859-1-Zeichenfolge gemäß den Dokumenten in UTF-8. Wenn Sie sich bei der Eingabecodierung nicht sicher sind, sind iconv () oder mb_convert_encoding () möglicherweise bessere Optionen, wie in Kommentaren und anderen Lösungen angegeben.
quelle
} else {
zu} else if (is_string ($d)) {
; Andernfalls ändern Sie alles in Zeichenfolgen (z. B.INT
wird aSTRING
).Matthieu Riegler präsentierte eine wirklich gute Lösung, aber ich musste sie leicht modifizieren, um auch Objekte zu handhaben:
Noch ein Hinweis: json_last_error () kann beim Debuggen der Funktionen json_encode () / json_encode () hilfreich sein.
quelle
elseif
statt seinelse if
? (dh kein Leerzeichen).if(): elseif:
else if(is_int($d)||is_bool($d)) return $d;
vor dem letzten einfügen , weil:{"success":true, "message":"Ⲃⲟⲟ𝓵ⲉⲁⲛ ⲁⲛⲇ Ⲓⲛϯⲉ𝓰ⲉꞅ𝛓"}
else
fürelse if(is_string ($d))
; Andernfalls ändern Sie alles in Zeichenfolgen (z. B.INT
wird aSTRING
).Für mich war die Antwort auf dieses Problem das Einstellen
charset=utf8
meiner PDO-Verbindung.quelle
$mysqli->set_charset("utf8");
Sie einfach an, nachdem Sie Ihre Datenbank bearbeitet haben.utf8mb4
in neueren MySQL-Versionen.utf8
ist obsolet.Adam Bubela präsentierte auch eine wirklich gute Lösung, die mir bei der Lösung meines Problems half, und hier ist die vereinfachte Funktion:
quelle
Ich habe genau das gleiche Problem mit PHP 5.6. Ich verwende Open Server + Nginx unter Windows 7. Alle Zeichensätze sind auf UTF-8 eingestellt. Theoretisch laut offizieller Dokumentation Flagge
sollte dies lösen. Dies ist leider nicht mein Fall. Keine Ahnung warum. Alle obigen Schnipsel lösen mein Problem nicht, daher habe ich meine eigene Implementierung gefunden. Ich glaube, es könnte jemandem helfen. Zumindest bestehen russische Buchstaben den Test.
quelle
Diese akzeptierte Antwort funktioniert. Aber falls Sie Ihre Daten von MySQL erhalten (wie ich es war), gibt es einen einfacheren Weg.
Sobald Sie Ihre Datenbank geöffnet haben, können Sie vor der Abfrage den Zeichensatz mit mysqli wie folgt festlegen:
ODER
LINK: http://php.net/manual/en/mysqli.set-charset.php
quelle
Ich bin auf einem Server mit einer älteren Version von PHP (5.2) auf dieses Problem gestoßen. Ich habe das JSON_FORCE_OBJECT-Flag verwendet, und anscheinend wird dies erst in Version 5.3 unterstützt
Wenn Sie dieses Flag verwenden, überprüfen Sie unbedingt Ihre Version!
Eine Problemumgehung scheint darin zu bestehen, vor dem Codieren nur in ein Objekt umzuwandeln, z.
quelle
Die Rücksendung von ist
mb_detect_encoding
möglicherweise nicht korrekt:Abhängig von der Standarderkennungsreihenfolge können die oben genannten Ergebnisse unterschiedlich ausfallen, sodass die Codierung fälschlicherweise als UTF-8 gemeldet wird. ( Hier ist ein größeres Beispiel .)
Es ist wahrscheinlich, dass Ihre Daten nicht als UTF-8 codiert sind und daher
json_encode
zurückkehrenfalse
. Sie sollten sich vor der JSON-Codierung die Konvertierung Ihrer Zeichenfolgen in UTF-8 ansehen:quelle
Ich habe Daten von ob_get_clean () erhalten und hatte das gleiche Problem, aber die oben genannten Lösungen funktionieren bei mir nicht. In meinem Fall war die Lösung dies, vielleicht hilft es jemandem.
quelle
Die Verwendung von utf8_encode () für diese Zeichenfolge hat mein Problem gelöst.
quelle
Ich habe Adam Bubelas Antwort verbessert. Ich hasse es einfach, wenn Blöcke nicht durch {und} geschlossen werden. Es ist sauberer und Sie führen keine Fehler ein oder vielleicht habe ich Perl in der Vergangenheit verwendet :)
quelle
Wenn Sie diese Daten aus einer Datenbank
mysqli_set_charset($connection, "utf8");
abrufen , verwenden Sie sie in Verbindung, wenn Sie die Parameter aus der Datenbank abrufenquelle
Dieses Problem tritt manchmal auf - Sie übergeben die Header-Zugriffskontrolle nicht.
In meinem Fall, wenn mir vor json_encode ein Echo hinzugefügt wurde. Es zeigte das Ergebnis, sonst kam eine leere Seite.
Ich fügte hinzu
und mein Problem gelöst.
quelle