Saya mengalami satu masalah dengan fungsi PHP json_encode. Fungsi ini mengkodekan angka sebagai string, misalnya
array('id' => 3)
menjadi
"{ ["id": "3", ...)
Ketika js menemukan nilai-nilai ini, js mengartikannya sebagai string dan operasi numerik gagal pada mereka. Apakah ada yang tahu beberapa cara untuk mencegah json_encode
dari pengkodean angka sebagai string? Terima kasih!
Perhatikan bahwa sejak PHP 5.3.3, ada flag untuk mengkonversi angka secara otomatis (parameter opsi ditambahkan di PHP 5.3.0):
$arr = array( 'row_id' => '1', 'name' => 'George' );
echo json_encode( $arr, JSON_NUMERIC_CHECK ); // {"row_id":1,"name":"George"}
I, likewise was reading from a DB (PostgreSQL) and everything was a string. We loop over each row and do things with it to build up our final results array, so I used
$result_arr[] = array($db_row['name'], (int)$db_row['count']);
within the loop to force it to be an integer value. When I do json_encode($result_arr)
now, it correctly formats it as a number. This allows you to control what is and is not a number coming from your database.
EDIT:
The json_encode()
function also has the ability to do this on the fly using the JSON_NUMERIC_CHECK
flag as a second argument to it. You need to be careful using it though as shown in this users example in the documentation (copied below): http://uk3.php.net/manual/en/function.json-encode.php#106641
<?php
// International phone number
json_encode(array('phone_number' => '+33123456789'), JSON_NUMERIC_CHECK);
?>
And then you get this JSON:
{"phone_number":33123456789}
Saya telah melakukan tes yang sangat cepat:
$a = array(
'id' => 152,
'another' => 'test',
'ananother' => 456,
);
$json = json_encode($a);
echo $json;
Ini tampaknya seperti yang Anda gambarkan, jika saya tidak salah?
Dan saya mendapatkan sebagai output:
{"id":152,"another":"test","ananother":456}
Jadi, dalam hal ini, bilangan bulat belum dikonversi ke string.
Namun, hal ini mungkin tergantung dari versi PHP yang kita gunakan : ada beberapa bug terkait json_encode yang telah diperbaiki, tergantung pada versi PHP....
Pengujian ini dilakukan dengan PHP 5.2.6 ; Saya mendapatkan hal yang sama dengan PHP 5.2.9 dan 5.3.0 ; Saya tidak punya versi 5.2.x lain untuk diuji :-(
Versi PHP mana yang Anda gunakan? Atau apakah test-case Anda lebih kompleks dari contoh yang Anda posting?
Mungkin salah satu laporan bug di http://bugs.php.net/ bisa jadi terkait ? Misalnya, Bug #40503 : konversi integer json_encode tidak konsisten dengan PHP ?
Mungkin Bug #38680 bisa menarik minat Anda juga, btw ?
I'm menghadapi masalah yang sama (PHP-5.2.11/Windows). I'm menggunakan solusi ini
$json = preg_replace( "/\"(\d+)\"/", '$1', $json );
yang menggantikan semua (non-negatif, bilangan bulat) bilangan tertutup dalam tanda kutip dengan nomor sendiri (',"42",' menjadi '42').
Lihat juga komentar ini di PHP manual.
mencoba
$arr = array('var1' => 100, 'var2' => 200); $json = json_encode( $arr, JSON_NUMERIC_CHECK);
Tapi itu hanya bekerja pada PHP 5.3.3. Lihatlah PHP json_encode perubahan log http://php.net/manual/en/function.json-encode.php#refsect1-function.json-encode-changelog
Berikut tes menegaskan bahwa mengubah type ke string penyebab json_encode() untuk kembali numerik sebagai JSON string (yaitu, dikelilingi oleh tanda kutip ganda). Gunakan settype(arr["var"], "integer") atau settype($arr["var"], "float") untuk memperbaikinya.
<?php
class testclass {
public $foo = 1;
public $bar = 2;
public $baz = "Hello, world";
}
$testarr = array( 'foo' => 1, 'bar' => 2, 'baz' => 'Hello, world');
$json_obj_txt = json_encode(new testclass());
$json_arr_txt = json_encode($testarr);
echo "<p>Object encoding:</p><pre>" . $json_obj_txt . "</pre>";
echo "<p>Array encoding:</p><pre>" . $json_arr_txt . "</pre>";
// Both above return ints as ints. Type the int to a string, though, and...
settype($testarr["foo"], "string");
$json_arr_cast_txt = json_encode($testarr);
echo "<p>Array encoding w/ cast:</p><pre>" . $json_arr_cast_txt . "</pre>";
?>
Jadi Pascal MARTIN isn't mendapatkan cukup kredit di sini. Memeriksa nilai-nilai numerik pada setiap JSON kembali tidak layak untuk proyek yang sudah ada dengan ratusan server side fungsi.
Saya diganti php-mysql dengan php-mysqlnd, dan masalah pergi. Angka ini adalah angka-angka, string adalah string, boolean adalah boolean.
Untuk kepentingan kelengkapan (seperti yang saya dapat't menambahkan komentar namun), izinkan saya juga menambahkan detail ini sebagai jawaban lain:
(Edit: Untuk dibaca setelah menyadari bahwa sumber data (yaitu di OP's kasus, database hasil set) bisa menjadi masalah (dengan kembali kolom numerik sebagai string), dan json_encode() sebenarnya bukan sumber masalah)
Halaman Manual dari kedua "mysql_fetch_array":
Kembali array dari string yang sesuai untuk diambil baris,
... dan "mysql fetch baris":
Kembali numerik array dari string yang sesuai untuk diambil baris
dengan jelas menyatakan bahwa; entri dalam array kembali akan menjadi string.
(Saya menggunakan DB kelas di phpBB2 (ya aku tahu, itu's usang!), dan "sql_fetchrow()" metode dari kelas yang menggunakan "mysql_fetch_array()")
Tidak menyadari bahwa, aku juga akhirnya menemukan pertanyaan ini, dan memahami masalah! :)
Seperti Pascal Martin dinyatakan di atas dalam tindak lanjut komentar, saya percaya solusi yang mengurus "salah ketik" masalah pada sumbernya (yaitu dengan menggunakan "mysql_field_type()" fungsi dan lakukan pengecoran yang tepat setelah mengambil, (atau lainnya mengambil metode seperti "objek"?)) akan menjadi lebih baik secara umum.
Saya juga punya masalah yang sama pengolahan data dari database. Pada dasarnya masalahnya adalah bahwa jenis dalam array untuk mengkonversi dalam json, diakui oleh PHP sebagai string dan bukan sebagai integer. Dalam kasus saya saya membuat query yang mengembalikan data dari DB kolom menghitung baris. PDO driver tidak mengenali kolom seperti int, tapi sebagai string. Aku diselesaikan dengan melakukan berperan sebagai int di kolom yang terpengaruh.
Hanya menjalankan ke dalam masalah yang sama dan database mengembalikan nilai string.
Saya menggunakan ini sebagai solusi:
$a = array(
'id' => $row['id'] * 1,
'another' => ...,
'ananother' => ...,
);
$json = json_encode($a);
Itu adalah mengalikan nilai dengan 1 untuk dilemparkan ke sejumlah
Harapan yang membantu seseorang
json_encode melakukan serialisasi beberapa struktur data dalam format JSON untuk dikirim ke seluruh jaringan. Oleh karena itu semua konten akan bertipe 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() di PHP atau parseInt() di Javascript) dan kemudian jalankan operasi.
Seperti oli_arborum mengatakan, saya pikir anda dapat menggunakan preg_replace
untuk melakukan pekerjaan. Hanya mengubah perintah seperti ini :
$json = preg_replace('#:"(\d+)"#', ':$1', $json);