I have a simple php structure with 3 nested arrays.
I do not use particular objects and I build myself the arrays with 2 nested loops.
Here is a sample of the var_dump of the array I want to convert to 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
In another script I have a similar structure and json_encode
works fine.
So I don't understand why json_encode
won't work here.
Edit : there seems to be a problem with the encoding. When mb_detect_encoding
returns ASCII, the json_encode
works but when it returns UTF8, it doesn't work anymore.
Edit2 : json_last_error()
returns JSON_ERROR_UTF8
which means : Malformed UTF-8 characters, possibly incorrectly encoded.
The return of
mb_detect_encoding
may not be correct:Depending on the default detection order, the above may return different results, so the encoding is falsely being reported as UTF-8. (Here's a larger example.)
It is likely that your data is not encoded as UTF-8, so
json_encode
is returningfalse
. You should look at converting your strings to UTF-8 before JSON-encoding:This accepted answer works. But in case you are getting your data from MySQL (as I was) there is an easier way.
Once you open you database, before you query you can set the character set using mysqli as follows:
OR
LINK: http://php.net/manual/en/mysqli.set-charset.php
Matthieu Riegler presented really good solution however I had to slightly modify it to handle objects too:
One more note: json_last_error() may be helpful in debugging json_encode()/json_encode() functions.
For me, the answer to this problem was setting charset=utf8 in my PDO connection.
ex:
$dbo = new PDO('mysql:host=localhost;dbname=yourdb;charset=utf8', $username, $password);
I have exactly the same problem on PHP 5.6. I use Open Server + Nginx on Windows 7. All charsets are set to UTF-8. In theory, according the official documentation, flag
should solve this. Unfortunately this is not my case. I do not know, why. All snippets above do not solve my problem, thus I have found my own implementation. I believe it could help someone. At least, Russian letters pass the test.