Saya mengalami satu masalah dengan fungsi PHP json_encode. Ini mengkodekan angka sebagai string, misalnya
array('id' => 3)
menjadi
"{ ["id": "3", ...)
Ketika js menemukan nilai-nilai ini, itu menafsirkannya sebagai string dan operasi numerik gagal pada mereka. Adakah yang tahu cara mencegah json_encode
penyandian angka sebagai string? Terima kasih!
php
javascript
json
Chris Barnhill
sumber
sumber
Jawaban:
Saya telah melakukan tes yang sangat cepat:
Ini sepertinya seperti apa yang Anda gambarkan, jika saya tidak salah?
Dan saya mendapatkan sebagai output:
Jadi, dalam hal ini, bilangan bulat belum dikonversi ke string.
Namun, ini mungkin tergantung dari versi PHP yang kami gunakan: ada beberapa bug terkait json_encode yang diperbaiki, tergantung pada versi PHP ...
Tes ini telah dilakukan dengan PHP 5.2.6; Saya mendapatkan hal yang sama dengan PHP 5.2.9 dan 5.3.0; Saya tidak memiliki versi 5.2.x lain untuk diuji, meskipun :-(
Versi PHP apa yang Anda gunakan? Atau apakah test case Anda lebih kompleks dari contoh yang Anda posting?
Mungkin satu laporan bug di http://bugs.php.net/ dapat dikaitkan? Misalnya, Bug # 40503: konversi integer json_encode tidak konsisten dengan PHP ?
Mungkin Bug # 38680 juga bisa membuat Anda tertarik, btw?
sumber
Perhatikan bahwa sejak PHP 5.3.3, ada bendera untuk angka konversi otomatis (parameter opsi ditambahkan dalam PHP 5.3.0):
sumber
JSON_NUMERIC_CHECK
mencoba menebak secara otomatis apakah string adalah angka atau tidak dengan mencoba menguraikannya. Itu sangat tidak bisa diandalkan jika Anda memikirkannya. Ini akan mengonversi semua properti yang tampak numerik menjadi angka (tidak hanya yang Anda inginkan) dan hanya akan melakukannya jika terlihat seperti angka. Setidaknya goyah jika tidak aman. Kode yang mengkonsumsi JSON yang dihasilkan mungkin bergantung pada jenis yang satu atau yang lain. Hal-hal aneh bisa terjadi jika harapan itu tidak terpenuhi. Jika Anda peduli dengan praktik dan keselamatan yang baik, Anda harus secara selektif mengonversi nilai yang Anda inginkan.Saya, juga membaca dari DB (PostgreSQL) dan semuanya adalah string. Kami mengulangi setiap baris dan melakukan hal-hal dengannya untuk membangun array hasil akhir kami, jadi saya gunakan
dalam loop untuk memaksanya menjadi nilai integer. Kapan saya melakukannya
json_encode($result_arr)
sekarang, itu memformatnya dengan benar sebagai angka. Ini memungkinkan Anda untuk mengontrol nomor yang berasal dan bukan dari basis data Anda.EDIT:
The
json_encode()
Fungsi juga memiliki kemampuan untuk melakukan hal ini dengan cepat menggunakanJSON_NUMERIC_CHECK
bendera sebagai argumen kedua untuk itu. Anda harus berhati-hati menggunakannya seperti yang ditunjukkan dalam contoh pengguna ini dalam dokumentasi (disalin di bawah): http://uk3.php.net/manual/en/function.json-encode.php#106641Dan kemudian Anda mendapatkan JSON ini:
sumber
json_encode
fungsi. ini adalah jawaban yang paling benar, tetapi berhati-hatilah karenaJSON_NUMERIC_CHECK
mengkonversi juga nomor telepon dan nilai string numerik lainnya, dan ini dapat memberikan masalah dalam memimpin nol atau '+' ... Saya sarankan untuk memperbaiki masalah ini dalam fungsi membaca DB.mencoba
$arr = array('var1' => 100, 'var2' => 200);
$json = json_encode( $arr, JSON_NUMERIC_CHECK);
Tetapi itu hanya bekerja pada PHP 5.3.3. Lihatlah PHP ini json_encode change log http://php.net/manual/en/function.json-encode.php#refsect1-function.json-encode-changelog
sumber
Saya mengalami masalah yang sama (PHP-5.2.11 / Windows). Saya menggunakan solusi ini
yang menggantikan semua angka (non-negatif, bilangan bulat) yang dilampirkan dalam tanda kutip dengan angka itu sendiri ('"42"' menjadi '42').
Lihat juga komentar ini dalam manual PHP .
sumber
$json_array = json_encode($some_array, false);
Jadi argumen palsu memberitahu PHP untuk tidak melakukan konversi objek.json_encode(array(-1=>'que', '0'=>'-1'))
$this->data = preg_replace("/\" *?: *?(\d+)/", '":"$1"', $this->data);
Tes berikut ini mengonfirmasi bahwa mengubah jenis ke string menyebabkan json_encode () mengembalikan numerik sebagai string JSON (yaitu, dikelilingi oleh tanda kutip ganda). Gunakan settype (arr ["var"], "integer") atau settype ($ arr ["var"], "float") untuk memperbaikinya.
sumber
Demi kelengkapan (karena saya belum dapat menambahkan komentar), izinkan saya juga menambahkan detail ini sebagai jawaban lain:
(Sunting: Dibaca setelah menyadari bahwa data sumber (yaitu dalam kasus OP, kumpulan hasil basis data) dapat menjadi masalah (dengan mengembalikan kolom numerik sebagai string), dan json_encode () sebenarnya bukan sumber masalah)
Halaman manual dari " mysql_fetch_array ":
... dan " baris mysql_ fetch_ ":
dengan jelas menyatakan bahwa; entri dalam array yang dikembalikan adalah string.
(Saya menggunakan kelas DB di phpBB2 (ya saya tahu, ini sudah usang!), Dan metode "sql_fetchrow ()" dari kelas itu menggunakan "mysql_fetch_array ()")
Tidak menyadarinya, saya akhirnya menemukan pertanyaan ini, dan memahami masalahnya! :)
Seperti yang dikatakan Pascal Martin di atas dalam komentar tindak lanjutnya, saya percaya solusi yang menangani masalah "tipe salah" pada sumbernya (yaitu dengan menggunakan fungsi " mysql_field_type () " dan melakukan casting tepat setelah mengambil, (atau metode pengambilan lainnya seperti "objek"?)) akan menjadi lebih baik secara umum.
sumber
Begitu Pascal MARTIN tidak mendapatkan kredit yang cukup di sini. Memeriksa nilai numerik pada setiap pengembalian JSON tidak cocok untuk proyek yang ada dengan ratusan fungsi sisi server.
Saya mengganti php-mysql dengan php-mysqlnd, dan masalahnya hilang. Angka adalah angka, string adalah string, booleans adalah boolean.
sumber
Saya juga punya masalah yang sama saat memproses data dari database. Pada dasarnya masalahnya adalah bahwa jenis dalam array untuk mengkonversi di json, dikenali oleh PHP sebagai string dan bukan sebagai integer. Dalam kasus saya, saya membuat kueri yang mengembalikan data dari baris penghitungan kolom DB. Driver PDO tidak mengenali kolom sebagai int, tetapi sebagai string. Saya dipecahkan dengan melakukan pemeran sebagai int di kolom yang terpengaruh.
sumber
sumber
itu adalah versi php masalahnya, memiliki masalah yang sama memutakhirkan versi php saya ke 5.6 menyelesaikan masalah
sumber
Melemparkan nilai ke int atau float sepertinya memperbaikinya. Sebagai contoh:
sumber
Anda dapat menggunakan (int) jika ada masalah !! Ini akan bekerja dengan baik.
sumber
Hanya mengalami masalah yang sama dan database mengembalikan nilai sebagai string.
Saya menggunakan ini sebagai solusinya:
Yaitu mengalikan nilainya dengan 1 untuk memasukkannya ke dalam angka
Semoga itu bisa membantu seseorang
sumber
json_encode membuat serial beberapa struktur data dalam format JSON untuk dikirim melalui jaringan. Oleh karena itu semua konten akan menjadi tipe string. Sama seperti ketika Anda menerima beberapa parameter dari $ _POST atau $ _GET.
Jika Anda harus membuat operasi numerik pada nilai yang dikirim, cukup konversikan ke int terlebih dahulu (dengan fungsi intval () dalam PHP atau parseInt () dalam Javascript) dan kemudian jalankan operasi.
sumber
Baiklah, PHP json_encode () mengembalikan sebuah string.
Anda dapat menggunakan parseFloat () atau parseInt () dalam kode js:
sumber
Seperti kata oli_arborum, saya pikir Anda dapat menggunakan
preg_replace
untuk melakukan pekerjaan. Ubah saja perintah seperti ini:sumber