J'ai une structure php simple avec 3 tableaux imbriqués.
Je n'utilise pas d'objets particuliers et je construis moi-même les tableaux avec 2 boucles imbriquées.
Voici un exemple du var_dump du tableau que je souhaite convertir en Json.
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
Dans un autre script, j'ai une structure similaire et json_encode
fonctionne très bien. Donc je ne comprends pas pourquoi json_encode
ne fonctionnera pas ici.
Edit: il semble y avoir un problème avec l'encodage. Quand mb_detect_encoding
retourne ASCII, json_encode
ça marche mais quand ça retourne UTF8, ça ne marche plus.
Edit2: json_last_error()
renvoie JSON_ERROR_UTF8
ce qui signifie: Caractères UTF-8 mal formés, éventuellement mal encodés .
This function only works with UTF-8 encoded data.
qu'il ne devrait y avoir aucun problème d'encodage.utf8_encode()
lesname
champs de votre tableau avant de remettre la chaînejson_encode()
.JSON_PARTIAL_OUTPUT_ON_ERROR
option pour voir le problème (par exemple, le champ avec UTF8 sera nul).Réponses:
Eh bien après 2 heures de fouille (cf Edits)
J'ai découvert ce qui suit:
mb_detect_encoding
renvoie probablement une réponse défectueuse, certaines chaînes n'étaient probablement pas UTF-8utf8_encode()
de ces chaînes a résolu mon problème, mais voir la note ci-dessousVoici une fonction récursive qui peut forcer la conversion en UTF-8 de toutes les chaînes contenues dans un tableau:
Utilisez-le simplement comme ceci:
Remarque: utf8_encode () encode la chaîne ISO-8859-1 en UTF-8 selon la documentation, donc si vous n'êtes pas sûr de l'encodage d'entrée iconv () ou mb_convert_encoding () peuvent être de meilleures options comme indiqué dans les commentaires et autres solutions.
la source
} else {
en} else if (is_string ($d)) {
; sinon vous changerez tout en chaînes (par exempleINT
deviendra aSTRING
).Matthieu Riegler a présenté une très bonne solution mais j'ai dû la modifier légèrement pour gérer les objets aussi:
Une dernière remarque: json_last_error () peut être utile pour déboguer les fonctions json_encode () / json_encode ().
la source
elseif
place deelse if
? (c'est-à-dire pas de blanc).if(): elseif:
else if(is_int($d)||is_bool($d)) return $d;
avant le dernier, à cause de:{"success":true, "message":"Ⲃⲟⲟ𝓵ⲉⲁⲛ ⲁⲛⲇ Ⲓⲛϯⲉ𝓰ⲉꞅ𝛓"}
else
pourelse if(is_string ($d))
; sinon vous changerez tout en chaînes (par exempleINT
deviendra aSTRING
).Pour moi, la réponse à ce problème était de configurer
charset=utf8
ma connexion PDO.la source
$mysqli->set_charset("utf8");
après avoir manipulé votre base de données.utf8mb4
dans les versions récentes de MySQL.utf8
est obsolète.Adam Bubela a également présenté une très bonne solution qui m'a aidé à résoudre mon problème, et voici la fonction simplifiée:
la source
J'ai exactement le même problème sur PHP 5.6. J'utilise Open Server + Nginx sur Windows 7. Tous les jeux de caractères sont définis sur UTF-8. En théorie, selon la documentation officielle , le drapeau
devrait résoudre ce problème. Ce n'est malheureusement pas mon cas. Je ne sais pas pourquoi. Tous les extraits ci-dessus ne résolvent pas mon problème, j'ai donc trouvé ma propre implémentation. Je pense que cela pourrait aider quelqu'un. Au moins, les lettres russes passent le test.
la source
Cette réponse acceptée fonctionne. Mais dans le cas où vous récupérez vos données de MySQL (comme je l'étais), il existe un moyen plus simple.
Une fois que vous ouvrez votre base de données, avant d'interroger, vous pouvez définir le jeu de caractères à l'aide de mysqli comme suit:
OU
LIEN: http://php.net/manual/en/mysqli.set-charset.php
la source
J'ai rencontré ce problème sur un serveur exécutant une ancienne version de PHP (5.2). J'utilisais l'indicateur JSON_FORCE_OBJECT, et apparemment, cela n'est pas pris en charge avant la 5.3
Donc, si vous utilisez cet indicateur, assurez-vous de vérifier votre version!
Une solution de contournement semble être simplement la conversion en un objet avant l'encodage, comme:
la source
Le retour de
mb_detect_encoding
peut ne pas être correct:En fonction de l'ordre de détection par défaut, ce qui précède peut renvoyer des résultats différents, de sorte que l'encodage est faussement signalé comme UTF-8. ( Voici un exemple plus large .)
Il est probable que vos données ne soient pas encodées au format UTF-8, elles sont donc
json_encode
renvoyéesfalse
. Vous devriez regarder à convertir vos chaînes en UTF-8 avant le codage JSON:la source
J'obtenais des données de ob_get_clean () et j'ai eu le même problème, mais les solutions ci-dessus ne fonctionnent pas pour moi. Dans mon cas, la solution était la suivante, peut-être qu'elle aidera quelqu'un.
la source
l'utilisation de utf8_encode () sur ces chaînes a résolu mon problème.
la source
J'ai amélioré la réponse d'Adam Bubela. Je déteste juste quand les blocs ne sont pas fermés par {et}. C'est plus propre et vous n'introduisez pas de bogues ou c'est peut-être que j'ai utilisé Perl dans le passé :)
la source
Si vous récupérez ces données à partir d'une base de données, utilisez
mysqli_set_charset($connection, "utf8");
en connexion lorsque vous récupérez les paramètres de la base de donnéesla source
ce problème survient parfois - vous ne transmettez pas le contrôle d'accès à l'en-tête.
Dans mon cas, si on m'a ajouté un écho avant json_encode. Il montrait le résultat sinon une page blanche arrivait.
J'ai ajouté
et mon problème résolu.
la source