Bagian dari tanggapan JSON situs web memiliki ini (... ditambahkan untuk konteks):
{..., now:function(){return(new Date).getTime()}, ...}
Apakah menambahkan fungsi anonim ke JSON valid? Saya berharap setiap kali Anda mengakses 'waktu' untuk mengembalikan nilai yang berbeda.
json
anonymous-function
Zachary Scott
sumber
sumber
JSON.parse('{now:function(){return(new Date).getTime()}')
. Inspektur berkata:Uncaught SyntaxError: Unexpected token n
Sekilas spesifikasi JSON mengkonfirmasi hal ini. Fokus pada bagian 'nilai'.Jawaban:
Tidak.
JSON murni dimaksudkan sebagai bahasa deskripsi data. Seperti dicatat di http://www.json.org , ini adalah "format pertukaran data ringan." - bukan bahasa pemrograman.
Sesuai http://en.wikipedia.org/wiki/JSON , "tipe dasar" yang didukung adalah:
null
sumber
a==null?1:a.toString()==""
Apa yang dikatakannya jika a = null maka ia mengembalikan 1 / true, jika "" berarti string kosong Anda juga mendapatkan 1 / true .. jika itu bukan null atau "" maka itu akan mengembalikan 0 / false, Anda bisa mereplikasi ini lagi untuk bekerja dengan [] dan {} cukup menambahkan?1:a==[]?1:a.toString()=={}.toString();
ke cuplikan prev saya. jadi mungkin fungsi ini akan membantu Anda.isnull=(function(a){return (a==null?1:a.toString()==""?1:a==[]?1:a.toString()=={}.toString())?true:false})
Saya akan menggunakan?1:0
alih-alih?true:false
tetapi (benar / salah)Masalahnya adalah JSON sebagai bahasa definisi data berevolusi dari JSON sebagai JavaScript Object Notation. Karena Javascript mendukung eval pada JSON, maka sah untuk meletakkan kode JSON di dalam JSON (dalam kasus penggunaan itu). Jika Anda menggunakan JSON untuk meneruskan data dari jarak jauh, maka menurut saya itu adalah praktik yang buruk untuk meletakkan metode di JSON karena Anda mungkin tidak memodelkan interaksi klien-server Anda dengan baik. Dan, selanjutnya, ketika ingin menggunakan JSON sebagai bahasa deskripsi data, saya akan mengatakan Anda bisa mendapatkan masalah dengan menyematkan metode karena beberapa parser JSON ditulis hanya dengan deskripsi data dan mungkin tidak mendukung definisi metode dalam struktur.
Entri Wikipedia JSON menjadi alasan yang baik untuk tidak menyertakan metode di JSON, dengan alasan masalah keamanan:
sumber
Mari kita kutip salah satu spesifikasinya - http://tools.ietf.org/html/rfc7159#section-12
The The JavaScript Object Notation (JSON) Data Interchange Format Keterangan negara:
Jadi semua jawaban yang menyatakan bahwa fungsi itu bukan bagian dari standar JSON adalah benar.
Jawaban resminya adalah: Tidak, tidak valid untuk mendefinisikan fungsi dalam hasil JSON!
Jawabannya bisa ya, karena "kode adalah data" dan "data adalah kode". Meskipun JSON digunakan sebagai format serialisasi data independen bahasa, tunneling "kode" melalui jenis lain akan berfungsi.
String JSON mungkin digunakan untuk meneruskan fungsi JS ke browser sisi klien untuk dieksekusi.
Ini mengarah ke pertanyaan seperti: Bagaimana " Jalankan kode JavaScript yang disimpan sebagai string ".
Bersiaplah, untuk menaikkan bendera "eval () is evil" dan tempelkan tanda "jangan gunakan terowongan melalui JSON" di sebelahnya.
sumber
Sejauh yang saya tahu, itu tidak standar. Sekilas di http://json.org/ mengkonfirmasi ini.
sumber
Tidak, jelas tidak.
Jika Anda menggunakan serializer JSON yang layak, itu tidak akan membiarkan Anda membuat serialisasi fungsi seperti itu. Ini OBJEK yang valid, tetapi bukan JSON yang valid. Apa pun maksud situs web itu, itu tidak mengirimkan JSON yang valid.
sumber
JSON secara eksplisit mengecualikan fungsi karena tidak dimaksudkan sebagai struktur data khusus JavaScript (terlepas dari nama JS).
sumber
Jawaban singkatnya adalah TIDAK ...
Perhatikan alasan mengapa:
Tapi tunggu ...
Masih ada cara untuk menyimpan fungsi Anda, secara luas tidak disarankan untuk itu, tetapi masih memungkinkan:
Kami berkata, Anda dapat menyimpan
string
... bagaimana jika mengubah fungsi Anda menjadi string?Kemudian Anda dapat merangkai data menggunakan
JSON.stringify(data)
dan kemudian menggunakanJSON.parse
untuk menguraikannya (jika langkah ini diperlukan) ...Dan eval untuk menjalankan fungsi string (sebelum melakukan itu, beri tahu Anda menggunakan eval secara luas tidak disarankan):
sumber
Melalui menggunakan NodeJS (sintaks commonJS) saya bisa mendapatkan jenis fungsi ini berfungsi, saya awalnya hanya memiliki struktur JSON di dalam beberapa file JS eksternal, tetapi saya ingin struktur itu lebih dari sebuah Kelas, dengan metode yang dapat diputuskan di menjalankan waktu.
Deklarasi 'Pelaksana' di myJSON tidak diperlukan.
sumber
Ekspresi fungsi di JSON sepenuhnya dimungkinkan, namun jangan lupa untuk membungkusnya dengan tanda kutip ganda. Berikut adalah contoh yang diambil dari desain database noSQL:
sumber
meskipun eval tidak disarankan, ini berfungsi:
sumber
Tinggalkan kutipannya ...
sumber