Saya memiliki struktur php sederhana dengan 3 array bersarang.
Saya tidak menggunakan objek tertentu dan saya membangun sendiri array dengan 2 loop bersarang.
Berikut adalah contoh var_dump dari array yang ingin saya ubah ke 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
Di skrip lain saya memiliki struktur yang mirip dan json_encode
berfungsi dengan baik. Jadi saya tidak mengerti mengapa json_encode
tidak bekerja di sini.
Edit: sepertinya ada masalah dengan encoding. Ketika mb_detect_encoding
mengembalikan ASCII, json_encode
berfungsi tetapi ketika mengembalikan UTF8, itu tidak berfungsi lagi.
Edit2: json_last_error()
mengembalikan JSON_ERROR_UTF8
yang berarti: Karakter UTF-8 cacat, mungkin salah dienkode .
This function only works with UTF-8 encoded data.
jadi seharusnya tidak ada masalah dengan pengkodean.utf8_encode()
padaname
bidang array Anda sebelum Anda menyerahkan string kejson_encode()
.JSON_PARTIAL_OUTPUT_ON_ERROR
opsi untuk melihat masalah (mis. Bidang dengan UTF8 akan menjadi nol).Jawaban:
Nah setelah 2 jam penggalian (cf Editan)
Saya menemukan hal berikut:
mb_detect_encoding
mengembalikan mungkin respons yang salah, beberapa string mungkin bukan UTF-8utf8_encode()
pada string itu memecahkan masalah saya, tetapi lihat catatan di bawahBerikut adalah fungsi rekursif yang dapat mengubah paksa ke UTF-8 semua string yang terdapat dalam sebuah array:
Gunakan seperti ini:
Catatan: utf8_encode () mengkodekan string ISO-8859-1 ke UTF-8 sesuai dengan dokumen jadi jika Anda tidak yakin dengan input encoding iconv () atau mb_convert_encoding () mungkin opsi yang lebih baik seperti yang dicatat dalam komentar dan solusi lainnya.
sumber
} else {
menjadi} else if (is_string ($d)) {
; jika tidak, Anda akan mengubah segalanya menjadi string (mis.INT
akan menjadi aSTRING
).Matthieu Riegler menyajikan solusi yang sangat bagus namun saya harus sedikit memodifikasinya untuk menangani objek juga:
Satu catatan lagi: json_last_error () mungkin berguna dalam debugging fungsi json_encode () / json_encode ().
sumber
elseif
bukanelse if
? (yaitu tidak boleh kosong).if(): elseif:
else if(is_int($d)||is_bool($d)) return $d;
sebelum yang terakhir, karena:{"success":true, "message":"Ⲃⲟⲟ𝓵ⲉⲁⲛ ⲁⲛⲇ Ⲓⲛϯⲉ𝓰ⲉꞅ𝛓"}
else
untukelse if(is_string ($d))
; jika tidak, Anda akan mengubah segalanya menjadi string (mis.INT
akan menjadi aSTRING
).Bagi saya, jawaban untuk masalah ini adalah pengaturan
charset=utf8
koneksi PDO saya.sumber
$mysqli->set_charset("utf8");
setelah melakukan penanganan database Anda.utf8mb4
di versi MySQL terbaru.utf8
sudah usang.Adam Bubela juga menyajikan solusi yang sangat bagus yang membantu saya menyelesaikan masalah saya, dan berikut adalah fungsi yang disederhanakan:
sumber
Saya memiliki masalah yang sama persis di PHP 5.6. Saya menggunakan Open Server + Nginx pada Windows 7. Semua charset disetel ke UTF-8. Secara teori, menurut dokumentasi resmi , bendera
harus menyelesaikan ini. Sayangnya ini bukan kasus saya. Saya tidak tahu kenapa. Semua potongan di atas tidak menyelesaikan masalah saya, jadi saya telah menemukan implementasi saya sendiri. Saya percaya itu bisa membantu seseorang. Setidaknya, huruf Rusia lulus ujian.
sumber
Jawaban yang diterima ini berhasil. Tetapi jika Anda mendapatkan data Anda dari MySQL (seperti yang saya lakukan sebelumnya) ada cara yang lebih mudah.
Setelah Anda membuka database Anda, sebelum Anda membuat kueri, Anda dapat mengatur set karakter menggunakan mysqli sebagai berikut:
ATAU
LINK: http://php.net/manual/en/mysqli.set-charset.php
sumber
Saya mengalami masalah ini di server yang menjalankan versi PHP yang lebih lama (5.2). Saya menggunakan flag JSON_FORCE_OBJECT, dan tampaknya itu tidak didukung hingga 5.3
Jadi jika Anda menggunakan bendera itu, pastikan untuk memeriksa versi Anda!
Solusi yang tampaknya hanya mentransmisikan ke objek sebelum encoding, seperti:
sumber
Pengembalian
mb_detect_encoding
mungkin salah:Bergantung pada urutan deteksi default, yang di atas mungkin memberikan hasil yang berbeda, sehingga encoding salah dilaporkan sebagai UTF-8. ( Berikut contoh yang lebih besar .)
Sepertinya data Anda tidak dienkode sebagai UTF-8, begitu
json_encode
juga yang ditampilkanfalse
. Anda harus melihat cara mengonversi string Anda ke UTF-8 sebelum encoding JSON:sumber
Saya mendapatkan data dari ob_get_clean () dan memiliki masalah yang sama, tetapi solusi di atas tidak berfungsi untuk saya. Dalam kasus saya, solusinya adalah ini, mungkin itu akan membantu seseorang.
sumber
menggunakan utf8_encode () pada string itu memecahkan masalah saya.
sumber
Saya telah memperbaiki jawaban Adam Bubela. Saya benci jika blok tidak ditutup oleh {dan}. Ini lebih bersih dan Anda tidak memperkenalkan bug atau mungkin itu karena saya menggunakan Perl di masa lalu :)
sumber
Jika Anda mendapatkan data ini dari database, gunakan
mysqli_set_charset($connection, "utf8");
koneksi saat mendapatkan params dari databasesumber
masalah ini terkadang muncul - Anda tidak melewati kontrol akses header.
Dalam kasus saya jika saya telah menambahkan gema sebelum json_encode. Itu menunjukkan hasil, jika tidak, halaman kosong akan datang.
saya tambahkan
dan masalah saya teratasi.
sumber