Matthieu Riegler Matthieu Riegler - 9 days ago 4x
JSON Question

Why would json_encode returns an empty string

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
returns ASCII, the json_encode works but when it returns UTF8, it doesn't work anymore.

Edit2 :
which means : Malformed UTF-8 characters, possibly incorrectly encoded.


Well after 2 hours of digging (cf Edits)

I found out following :

  • In my case it's a encoding problem
  • mb_detect_encoding returns probably a faulty response, some strings were probably not UTF-8
  • using utf8_encode() on those string solved my problem.

Here is a recursive function that can force convert to UTF-8 all the strings contained in an array:

function utf8ize($d) {
    if (is_array($d)) {
        foreach ($d as $k => $v) {
            $d[$k] = utf8ize($v);
    } else if (is_string ($d)) {
        return utf8_encode($d);
    return $d;

Use it simply like this:

echo json_encode(utf8ize($data));