Saya membutuhkan metode yang sangat, sangat cepat untuk memeriksa apakah sebuah string adalah JSON atau tidak. Saya merasa ini bukan cara terbaik:
function isJson($string) {
return ((is_string($string) &&
(is_object(json_decode($string)) ||
is_array(json_decode($string))))) ? true : false;
}
Adakah penggemar kinerja di luar sana yang ingin meningkatkan metode ini?
php
json
error-handling
json-deserialization
jsonresult
Kirk Ouimet
sumber
sumber
json_decode
sekali ... juga, periksa input dan kembalikan nilaijson_decode
.Jawaban:
sumber
{
,[
atau simbol pertama dari literal lain berpotensi sangat mempercepat ini ketika banyak string yang masuk diharapkan bukan JSON.6.5 = true, '300' = true, 9 = true
dll. Jadi ini mungkin nilai JSON yang valid tetapi fungsinya mungkin tidak berperilaku seperti yang Anda harapkan, jika Anda ingin memeriksa hanya untuk string JSON yang valid dengan{}
atau[]
;Fungsi
json_last_error
mengembalikan kesalahan terakhir yang terjadi selama JSON encoding dan decoding. Jadi cara tercepat untuk memeriksa JSON yang valid adalahCatatan yang
json_last_error
didukung dalam PHP> = 5.3.0 saja.Itu selalu baik untuk mengetahui kesalahan yang tepat selama waktu pengembangan. Berikut ini adalah program lengkap untuk memeriksa kesalahan yang sebenarnya berdasarkan pada dokumen PHP.
Karena
json_last_error
tidak didukung dalam PHP 5.2, Anda dapat memeriksa apakah penyandian atau decoding mengembalikan booleanFALSE
. Berikut ini sebuah contohSemoga ini bermanfaat. Selamat Coding!
sumber
((strlen($json) === 5) && ($json !== 'false'))
juga harus dilakukan untuk menghindari kelebihan itu?json_last_error
kembaliJSON_ERROR_NONE
.Yang perlu Anda lakukan hanyalah ini ...
Permintaan ini bahkan tidak memerlukan fungsi terpisah. Bungkus is_object sekitar json_decode dan lanjutkan. Tampaknya solusi ini membuat orang terlalu memikirkannya.
sumber
is_array
selain ituis_object
, yang lainis_object
akan mengembalikan false untuk array sederhana yang dikodekan sebagai JSON. Jadi @ggutenberg benar dalam hal ini. Melewati argumen yang benar untukjson_decode
memaksa objek untuk dikembalikan sebagai array. Secara teori Anda selalu dapat memaksa decode ke array dan hanya memeriksais_array
, itu harus bekerja.json_encode($array)
untuk array PHP sederhana, dan kemudianjson_decode($str)
saya akan menerima objek, tetapi tidak array.json_decode($str, true)
memaksa untuk mengkonversi menjadi array. Mengapa string rumit dalam kode Anda? Periksais_array(json_decode($str, true))
dan beberapa saat kemudian ketika Anda membacanya, Anda akan memahami bahwa yang diterjemahkan hanya array. Jauh lebih sulit untuk ditebak,is_object(json_decode($MyJSONArray))
"Oh, di sini saya memeriksa decode apakah array atau tidak?"json_decode
untuk mengembalikan array untuk menyelamatkan Anda memeriksa objek dan array, tetapi jika Anda tidak DAN Andajson_decode
apa adalah larik sederhana untuk memulai, Anda akan menerima larik sebagai imbalan atas dekode, bukan objek. Anda harus menggunakanJSON_FORCE_OBJECT
jika Anda ingin selalu memaksa objek pada encode JIKA melewati array sederhana.This request does not require a separate function even
. Sebenarnya, tidak ada solusi yang membutuhkan fungsi terpisah. Maksud suatu fungsi bukan untuk membuat beberapa baris kode terlihat seperti satu baris kode. Maksud dari fungsi ini adalah untuk membuat standar proses pengecekan JSON di mana-mana dalam aplikasi Anda, sehingga programmer yang berbeda (atau programmer yang sama dari waktu ke waktu) tidak menggunakan prosedur pemeriksaan yang berbeda pada tahap yang berbeda dalam aliran program.Menggunakan
json_decode
untuk "menyelidiki" itu mungkin sebenarnya bukan cara tercepat. Jika itu adalah struktur yang sangat bersarang, maka instantiasi banyak objek array untuk membuangnya adalah membuang-buang memori dan waktu.Jadi mungkin lebih cepat untuk digunakan
preg_match
dan regex RFC4627 juga memastikan validitas :Hal yang sama di PHP:
Namun, tidak cukup penggila kinerja yang peduli dengan tolok ukur di sini.
sumber
json_decode
selalu lebih cepat daripada regre PCRE. (Meskipun itu tidak sangat dioptimalkan, tidak ada tes sintetis yang ditemukan, dan mungkin berperilaku berbeda di Perl ..)\r
\n
\t
itu hanya masuk akal sehingga PHP tidak menginterpolasi mereka, tetapi biarkan PCRE menafsirkannya (hanya diperlukan untuk/x
mode). Kejadian lain tidak sepenuhnya membutuhkannya; namun masih "backslash lolos sendiri" di semua konteks PHP string. Jadi orang bisa menganggapnya lebih tepat.Ini akan mengembalikan true jika string Anda mewakili json array atau objek :
Ini menolak string json yang hanya berisi angka, string atau boolean, meskipun string tersebut secara teknis valid json.
Ini adalah cara terpendek yang bisa saya lakukan.
sumber
var_dump(isJson('[]')); // bool(false)
. Menurut dokumentasi tentang booleans, ini karena PHP mengevaluasi array dengan nol elemen sebagai false. Berikut ini adalah amandemen minor untuk menyesuaikan pernyataan pengembalian; ia melakukan perbandingan yang identik pada keluaran yang diterjemahkan yang menangani kasus ini:return $json !== false && $str != $json;
isJson('hello')
true, yang bukan valid json. Perbandingan longgar dipilih dengan sengaja di sini. Saya tidak punya solusi cepat untuk situasi array / objek kosong, kecuali yang jelekreturn $json == '[]' || ...
Cara paling sederhana dan tercepat yang saya gunakan adalah mengikuti;
Itu karena json_decode () mengembalikan NULL jika string yang dimasukkan bukan json atau json tidak valid.
Fungsi sederhana untuk memvalidasi JSON
Jika Anda harus memvalidasi JSON Anda di banyak tempat, Anda selalu dapat menggunakan fungsi berikut.
Dalam fungsi di atas, Anda akan mendapatkan balasan jika itu adalah JSON yang valid.
sumber
json_decode('null') == NULL
dannull
merupakan nilai JSON yang valid.JSON.parse('null')
di konsol dev Anda.http://tr.php.net/manual/en/function.json-decode.php nilai kembali adalah nol ketika terdeteksi penyandian yang tidak valid.
sumber
json_decode($str)!=null;
atau fungsi harus dipanggilis_not_json
.json_decode('null')
JSON yang valid sesuai dengan spesifikasi , dan harus mengembalikan nilainull
.is_json('false')
danis_json('[]')
akan kembalifalse
karena jenisnya tidak dicentang. Saya pikir metode ini sebaiknya kembali$str === null || json_decode($str) !== null
.Anda harus memvalidasi input Anda untuk memastikan string yang Anda lewati tidak kosong dan, pada kenyataannya, adalah string. String kosong bukan JSON yang valid.
Saya pikir dalam PHP lebih penting untuk menentukan apakah objek JSON bahkan memiliki data, karena untuk menggunakan data Anda perlu menelepon
json_encode()
ataujson_decode()
. Saya sarankan menolak objek JSON kosong sehingga Anda tidak perlu menjalankan encode dan decode pada data kosong.sumber
'0'
bukan json yang valid ... kenapa aku harus waspada? @KzqaiIni akan melakukannya:
Seperti yang ditunjukkan dalam jawaban lain,
json_last_error()
mengembalikan kesalahan dari json_decode terakhir kami (). Namun ada beberapa kasus penggunaan tepi di mana fungsi ini saja tidak cukup komprehensif. Misalnya, jika Andajson_decode()
bilangan bulat (misalnya:)123
, atau serangkaian angka tanpa spasi atau karakter lain (misalnya:)"123"
,json_last_error()
fungsi tidak akan menangkap kesalahan.Untuk mengatasi ini, saya telah menambahkan langkah ekstra yang memastikan hasil dari kami
json_decode()
adalah objek atau array. Jika tidak, maka kami kembalifalse
.Untuk melihat ini dalam tindakan, periksa dua contoh ini:
json_last_error()
sumber
"hello"
adalah JSON yang valid, dan itu bukan objek maupun array,json_last_error()
sudah cukupjson_last_error()
mengembalikan kode kesalahan4
ketika Andajson_decode()
string"hello"
. Contoh di sini: 3v4l.org/lSsEohello
bukan JSON valid, tetapi"hello"
adalah 3v4l.org/OEJrQMetode yang mudah adalah dengan memeriksa hasil json ..
sumber
di GuzzleHttp :
sumber
Sebelumnya saya hanya memeriksa nilai null, yang sebenarnya salah.
Sepotong kode di atas berfungsi baik dengan string. Namun begitu saya memberikan nomor, itu putus. Misalnya.
Untuk memperbaikinya apa yang saya lakukan sangat sederhana.
sumber
sumber
Cara sederhana lainnya
sumber
json_decode($str,true)
membuatnya mengkonversi objek ke array sehingga akan melewati pemeriksaan is_array. Anda benar tentang string, integer, dll.Kita perlu memeriksa apakah string yang dikirimkan bukan numerik karena dalam kasus ini json_decode tidak menimbulkan kesalahan.
sumber
Saya menemukan pertanyaan ini setelah menemukan sesuatu yang serupa dalam pekerjaan saya, kemarin. Solusi saya pada akhirnya adalah gabungan dari beberapa pendekatan di atas:
sumber
Saya sudah mencoba beberapa solusi itu tetapi tidak ada yang berhasil untuk saya. Saya mencoba hal sederhana ini:
Saya pikir ini solusi yang baik sejak JSON decode tanpa parameter kedua memberikan objek.
EDIT: Jika Anda tahu apa yang akan menjadi input, Anda dapat menyesuaikan kode ini dengan kebutuhan Anda. Dalam kasus saya, saya tahu saya memiliki Json yang dimulai dengan "{", jadi saya tidak perlu memeriksa apakah itu array.
sumber
Menggunakan PHPBench dengan kelas berikut, hasil di bawah ini dicapai:
Kesimpulan: Cara tercepat untuk memeriksa apakah json valid adalah kembali
json_decode($json, true) !== null)
.sumber
Saya tidak tahu tentang kinerja atau keanggunan solusi saya, tetapi itulah yang saya gunakan:
Karena semua string JSON saya yang dikodekan dimulai dengan {"cukup untuk menguji untuk ini dengan RegEx. Saya sama sekali tidak fasih dengan RegEx, jadi mungkin ada cara yang lebih baik untuk melakukan ini. Juga: strpos () mungkin lebih cepat.
Hanya mencoba untuk memberikan nilai kemampuan saya.
PS Baru saja memperbarui string RegEx
/^[\[\{]\"/
untuk juga menemukan string array JSON. Jadi sekarang terlihat baik ["atau {" di awal string.sumber
Seharusnya seperti ini:
UnitTest
sumber
ErrorException
jika string adalah array atau objek.Memperluas jawaban ini Bagaimana dengan yang berikut:
sumber
Hai, ini potongan kecil dari perpustakaan saya, dalam kondisi pertama ini saya hanya memeriksa apakah data json kemudian mengembalikannya jika diterjemahkan dengan benar, harap perhatikan penggunaan substr untuk kinerja (saya belum melihat file json apa pun yang tidak memulai juga oleh {atau [
sumber
Saran lain dari saya :)
sumber
Fungsi kustom
Kasing
Sumber daya
https://gist.github.com/rafasashi/93d06bae83cc1a1f440b
sumber
Fungsi yang baru dibuat untuk kompatibilitas PHP 5.2, jika Anda membutuhkan data yang diterjemahkan untuk sukses:
Pemakaian:
Beberapa tes:
sumber
sumber
Modifikasi sederhana untuk jawaban henrik untuk menyentuh kemungkinan yang paling diperlukan.
(termasuk "{} dan []")
sumber
Cara tercepat untuk mungkin memecahkan kode objek JSON mungkin untuk PHP objek / array:
sumber
Berikut ini adalah performa dan fungsi sederhana yang saya buat (yang menggunakan validasi string dasar sebelum digunakan
json_decode
untuk string yang lebih besar):sumber