Mam prostą strukturę php z 3 zagnieżdżonymi tablicami.
Nie używam konkretnych obiektów i sam buduję tablice z 2 zagnieżdżonymi pętlami.
Oto przykład zmiennej var_dump tablicy, którą chcę przekonwertować na 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
W innym skrypcie mam podobną strukturę i json_encode
działa dobrze. Więc nie rozumiem, dlaczego json_encode
tu nie zadziała.
Edycja: wydaje się, że wystąpił problem z kodowaniem. Kiedy mb_detect_encoding
zwraca ASCII, json_encode
działa, ale kiedy zwraca UTF8, już nie działa.
Edit2: json_last_error()
zwraca, JSON_ERROR_UTF8
co oznacza: zniekształcone znaki UTF-8, prawdopodobnie nieprawidłowo zakodowane .
This function only works with UTF-8 encoded data.
, że nie powinno być żadnych problemów z kodowaniem.utf8_encode()
na swoichname
polach tablicy przed przekazać ciągjson_encode()
.JSON_PARTIAL_OUTPUT_ON_ERROR
opcji, aby zobaczyć problem (np. Pole z UTF8 będzie puste).Odpowiedzi:
Dobrze po 2 godzinach kopania (por. Edycje)
Dowiedziałem się, co następuje:
mb_detect_encoding
zwraca prawdopodobnie błędną odpowiedź, niektóre łańcuchy prawdopodobnie nie były w UTF-8utf8_encode()
na tych ciągach rozwiązało mój problem, ale patrz uwaga poniżejOto funkcja rekurencyjna, która może wymusić konwersję do UTF-8 wszystkich ciągów zawartych w tablicy:
Użyj go po prostu w ten sposób:
Uwaga: utf8_encode () koduje ciąg ISO-8859-1 do UTF-8 zgodnie z dokumentacją, więc jeśli nie masz pewności co do kodowania wejściowego iconv () lub mb_convert_encoding (), mogą być lepsze opcje, jak zauważono w komentarzach i innych rozwiązaniach.
źródło
} else {
celu} else if (is_string ($d)) {
; w przeciwnym razie zmienisz wszystko na łańcuchy (np.INT
stanie się aSTRING
).Matthieu Riegler zaprezentował naprawdę dobre rozwiązanie, ale musiałem je nieco zmodyfikować, aby obsługiwać obiekty:
Jeszcze jedna uwaga: json_last_error () może być pomocna w debugowaniu funkcji json_encode () / json_encode ().
źródło
elseif
zamiast tegoelse if
? (tj. nie puste).if(): elseif:
else if(is_int($d)||is_bool($d)) return $d;
przed ostatnią inną, ponieważ:{"success":true, "message":"Ⲃⲟⲟ𝓵ⲉⲁⲛ ⲁⲛⲇ Ⲓⲛϯⲉ𝓰ⲉꞅ𝛓"}
else
naelse if(is_string ($d))
; w przeciwnym razie zmienisz wszystko na łańcuchy (np.INT
stanie się aSTRING
).Dla mnie odpowiedzią na ten problem było ustawienie
charset=utf8
w moim połączeniu PDO.źródło
$mysqli->set_charset("utf8");
po wykonaniu obsługi bazy danych.utf8mb4
w najnowszych wersjach MySQL.utf8
jest przestarzały.Adam Bubela również zaprezentował naprawdę dobre rozwiązanie, który pomógł mi rozwiązać mój problem, a oto uproszczona funkcja:
źródło
Mam dokładnie ten sam problem w PHP 5.6. Używam Open Server + Nginx w Windows 7. Wszystkie zestawy znaków są ustawione na UTF-8. Teoretycznie według oficjalnej dokumentacji flaga
powinien rozwiązać ten problem. Niestety nie jest to mój przypadek. Nie wiem dlaczego. Wszystkie powyższe fragmenty nie rozwiązują mojego problemu, dlatego znalazłem własną implementację. Myślę, że to mogłoby komuś pomóc. Przynajmniej rosyjskie litery zdają egzamin.
źródło
Ta zaakceptowana odpowiedź działa. Ale w przypadku, gdy otrzymujesz dane z MySQL (tak jak ja), jest łatwiejszy sposób.
Po otwarciu bazy danych przed zapytaniem możesz ustawić zestaw znaków za pomocą mysqli w następujący sposób:
LUB
LINK: http://php.net/manual/en/mysqli.set-charset.php
źródło
Napotkałem ten problem na serwerze ze starszą wersją PHP (5.2). Używałem flagi JSON_FORCE_OBJECT i najwyraźniej nie jest ona obsługiwana do 5.3
Więc jeśli używasz tej flagi, sprawdź swoją wersję!
Wydaje się, że obejście polega na rzutowaniu na obiekt przed kodowaniem, na przykład:
źródło
Zwrot
mb_detect_encoding
może być nieprawidłowy:W zależności od domyślnej kolejności wykrywania powyższe może zwracać różne wyniki, więc kodowanie jest fałszywie zgłaszane jako UTF-8. ( Oto większy przykład .)
Prawdopodobnie Twoje dane nie są zakodowane jako UTF-8, więc
json_encode
powracająfalse
. Powinieneś spojrzeć na konwersję ciągów do UTF-8 przed kodowaniem JSON:źródło
Otrzymywałem dane z ob_get_clean () i miałem ten sam problem, ale powyższe rozwiązania nie działają dla mnie. W moim przypadku rozwiązanie było takie, może komuś pomoże.
źródło
użycie utf8_encode () na tych ciągach rozwiązało mój problem.
źródło
Poprawiłem odpowiedź Adama Bubeli. Po prostu nienawidzę, kiedy bloki nie są zamykane przez {i}. Jest czystszy i nie wprowadzasz błędów, a może to dlatego, że używałem Perla w przeszłości :)
źródło
Jeśli otrzymujesz te dane z bazy danych, użyj
mysqli_set_charset($connection, "utf8");
w połączeniu, gdy pobierzesz parametry z bazy danychźródło
ten problem pojawia się czasami - nie przekazujesz kontroli dostępu do nagłówka.
W moim przypadku, jeśli dodano jakiekolwiek echo przed json_encode. Pokazał wynik, w przeciwnym razie nadchodziła pusta strona.
dodałem
i mój problem został rozwiązany.
źródło