Dapatkah seseorang memberi tahu saya apa perbedaan utama antara objek JavaScript yang didefinisikan dengan menggunakan Object Literal Notation dan objek JSON ?
Menurut buku JavaScript dikatakan ini adalah objek yang didefinisikan dengan menggunakan Notasi Objek :
var anObject = {
property1 : true,
showMessage : function (msg) { alert(msg) }
};
Mengapa bukan objek JSON dalam kasus ini? Hanya karena itu tidak didefinisikan dengan menggunakan tanda kutip?
javascript
json
object-notation
kue pensil
sumber
sumber
Jawaban:
Mari kita perjelas dulu apa sebenarnya JSON itu. JSON adalah format pertukaran data tekstual , independen bahasa, seperti XML, CSV atau YAML.
Data dapat disimpan dalam banyak cara, tetapi jika harus disimpan dalam file teks dan dapat dibaca oleh komputer, ia harus mengikuti beberapa struktur. JSON adalah salah satu dari banyak format yang mendefinisikan struktur seperti itu.
Format tersebut biasanya tidak tergantung pada bahasa, artinya dapat diproses oleh Java, Python, JavaScript, PHP, apa saja.
Sebaliknya, JavaScript adalah bahasa pemrograman. Tentu saja JavaScript juga menyediakan cara untuk mendefinisikan / mendeskripsikan data, tetapi sintaksinya sangat spesifik untuk JavaScript.
Sebagai contoh counter, Python memiliki konsep tuple , sintaksnya adalah
(x, y)
. JavaScript tidak memiliki yang seperti ini.Mari kita lihat perbedaan sintaksis antara literal objek JSON dan JavaScript.
JSON memiliki batasan sintaksis berikut:
"
).true
false
null
{"foo":"bar","foo":"baz"}
) menghasilkan hasil yang tidak ditentukan, implementasi khusus; spesifikasi JSON secara khusus tidak mendefinisikan semantiknyaDalam JavaScript, objek literal dapat memiliki
undefined
.Mengetahui itu, hanya dengan melihat sintaks , contoh Anda bukan JSON karena dua alasan:
Tetapi yang paling penting, untuk mengulangi penjelasan saya dari awal: Anda berada dalam konteks JavaScript. Anda mendefinisikan objek JavaScript. Jika ada, "objek JSON" hanya dapat dimuat dalam string:
Artinya, jika Anda menulis kode sumber JavaScript, dan tidak berurusan dengan string , Anda tidak berurusan dengan JSON. Mungkin Anda menerima data sebagai JSON (mis., Melalui ajax atau membaca dari file), tetapi begitu Anda atau perpustakaan yang Anda gunakan telah menguraikannya, itu bukan JSON lagi.
Hanya karena objek literal dan JSON terlihat serupa , itu tidak berarti bahwa Anda dapat menamainya secara bergantian. Lihat juga Tidak ada yang namanya "Objek JSON" .
sumber
JSON memiliki sintaks yang jauh lebih terbatas termasuk:
"
dan bukan'
sumber
Sebenarnya tidak ada yang namanya "JSON Object".
Spesifikasi JSON adalah sintaksis untuk penyandian data sebagai string. Apa yang orang sebut "Objek JSON" (dalam javascript) sebenarnya hanyalah objek javascript biasa yang (mungkin) telah di-serialkan dari string JSON yang valid, dan dapat dengan mudah diserialisasi ulang sebagai string JSON yang valid. Ini umumnya berarti bahwa itu hanya berisi data (dan bukan fungsi). Ini juga berarti bahwa tidak ada tanggal, karena JSON tidak memiliki tipe tanggal (mungkin hal yang paling menyakitkan tentang JSON;)
Selanjutnya, (kata-kata kasar ...) ketika orang berbicara tentang "Objek JSON", mereka hampir selalu berarti data yang memiliki "kurung kurawal" di tingkat atas. Ini sesuai dengan objek javascript. Namun, spesifikasi JSON tidak mensyaratkan bahwa ada satu objek "kurung kurawal" di tingkat atas string JSON. JSON sangat valid untuk memiliki daftar di tingkat atas, atau bahkan hanya memiliki satu nilai. Jadi, sementara setiap "Objek JSON" sesuai dengan JSON yang valid, tidak semua string JSON yang valid sesuai dengan apa yang kita sebut "Objek JSON"! (karena string dapat mewakili daftar atau nilai atom)
sumber
JSON-text = object / array
.Menurut JSON dalam JavaScript ,
Dengan kata lain, JSON yang valid juga merupakan notasi objek JavaScript yang valid tetapi tidak harus sebaliknya.
Selain membaca dokumentasi , seperti yang disarankan @Filix King, saya juga menyarankan untuk bermain-main dengan validator JSON JSONLint online . Begitulah cara saya mengetahui bahwa kunci objek JSON harus berupa string.
sumber
🔫 JSON : Alternatif Bebas-Lemak untuk XML
JSON telah secara luas diadopsi oleh orang-orang yang menemukan bahwa itu membuatnya lebih mudah untuk menghasilkan aplikasi dan layanan terdistribusi. Jenis media Internet resmi untuk JSON adalah
application/json
RFC 4627
. Nama file JSON menggunakan ekstensi.json
.► JavaScript Object Notation (
JSON
) adalah format pertukaran data yang ringan, berbasis teks, dan tidak tergantung bahasa. JSON telah digunakan untuk bertukar data antara aplikasi yang ditulis dalam bahasa Pemrograman apa pun.JSON adalah bagian dari JavaScript. Javascript berasal dari Standar Bahasa Pemrograman ECMAScript.
► ECMAScript
ECMAScript telah berkembang menjadi salah satu bahasa pemrograman tujuan umum yang paling banyak digunakan di dunia. Ini dikenal sebagai bahasa yang tertanam di browser web tetapi juga telah banyak diadopsi untuk aplikasi server dan tertanam. ECMAScript didasarkan pada beberapa teknologi yang berasal, yang paling terkenal
JavaScript
(Netscape Communications)) danJScript
(Microsoft Corporation).) . Meskipun sebelum 1994, ECMA dikenal sebagai "Asosiasi Produsen Komputer Eropa", setelah 1994, ketika organisasi menjadi global, "merek dagang" "Ecma" disimpan karena alasan historis.ECMAScript adalah bahasa, sedangkan JavaScript, JScript, dan bahkan ActionScript disebut
"Dialects"
.Informasi tentang browser dan komputer pengguna Anda.
ECMAScript adalah bahasa scripting yang membentuk dasar JavaScript. .
JavaScript
language resources
ECMA-262
Links
Initial Edition, June 1997
PDF.
2nd Edition, August 1998
PDF.
3rd Edition, December 1999
PDF.
5th Edition, December 2009
PDF.
5.1 Edition, June 2011
HTML.
6th Edition, June 2015
HTML.
7ᵗʰ Edition, June 2016
HTML.
8th edition, June 2017
HTML.
9th Edition, 2018
HTML.
CATATAN « ECMAScript edisi ke-4 yang tidak dipublikasikan karena pekerjaan tidak lengkap .
► Nilai kunci harus dikutip, hanya String yang diizinkan untuk kunci. Jika Anda menggunakan selain String itu akan dikonversi ke String. Tapi tidak disarankan menggunakan kunci selain String. Lihat contoh seperti ini -
{ 'key':'val' }
selesaiRFC 4627 - jsonformatter
► String JSON harus dikutip dengan "dan bukan '. String sangat mirip dengan string C atau Java. String harus dibungkus dengan tanda kutip ganda.
Accessors Properti Obyek memberikan akses ke properti objek dengan menggunakan notasi titik atau notasi braket.
► Anda memiliki rentang nilai yang lebih terbatas (mis. Tidak ada fungsi yang diizinkan). Nilai dapat berupa string dalam tanda kutip ganda, angka, boolean, null, objek, atau array. Struktur ini dapat disarangkan.
►
JavaScript
adalah implementasi standar ECMAScript yang paling populer. Fitur inti Javascript didasarkan pada standar ECMAScript, tetapi Javascript juga memiliki fitur tambahan lainnya yang tidak ada dalam spesifikasi / standar ECMA. Setiap browser memiliki penerjemah JavaScript.JavaScript adalah bahasa yang diketik secara dinamis. Itu berarti Anda tidak perlu menentukan tipe data dari variabel saat Anda mendeklarasikannya, dan tipe data dikonversi secara otomatis sesuai kebutuhan selama eksekusi skrip.
Literals
:Object literals
RFC 7159
Struktur objek direpresentasikan sebagai sepasang kurung keriting yang mengelilingi nol atau lebih pasangan nama / nilai (atau anggota). Nama adalah sebuah string. Satu titik dua muncul setelah setiap nama, memisahkan nama dari nilai. Satu koma memisahkan nilai dari nama berikut. Nama-nama dalam suatu objek HARUS unik.
ECMAScript mendukung warisan berbasis prototipe. Setiap konstruktor memiliki prototipe terkait, dan setiap objek yang dibuat oleh konstruktor tersebut memiliki referensi implisit ke prototipe (disebut prototipe objek) yang terkait dengan konstruktornya. Lebih jauh, sebuah prototipe mungkin memiliki referensi implisit non-nol ke prototipe-nya, dan seterusnya; ini disebut rantai prototipe.
Dalam bahasa berorientasi objek berbasis kelas, secara umum, negara dilakukan oleh instance, metode dilakukan oleh kelas, dan pewarisan hanya struktur dan perilaku. Dalam ECMAScript, negara dan metode dilakukan oleh objek, dan struktur, perilaku, dan negara semuanya diwariskan.
Prototipe adalah objek yang digunakan untuk mengimplementasikan struktur, status, dan perilaku pewarisan dalam ECMAScript. Ketika konstruktor membuat objek, objek yang secara implisit referensi prototipe terkait konstruktor untuk tujuan menyelesaikan referensi properti. Prototipe terkait konstruktor dapat dirujuk oleh ekspresi program constructor.protype, dan properti yang ditambahkan ke prototipe objek dibagi, melalui pewarisan, oleh semua objek yang berbagi prototipe.
sumber
Bagi mereka yang masih berpikir bahwa RFC lebih penting daripada blog dan kesalahpahaman berdasarkan pendapat, mari kita coba untuk menjelaskan beberapa poin. Saya tidak akan mengulangi semua perbedaan yang benar yang telah disebutkan dalam jawaban sebelumnya, di sini saya hanya mencoba menambahkan nilai meringkas beberapa bagian penting rfc7159
Ekstrak dari https://tools.ietf.org/html/rfc7159
Contoh (dari halaman 12 dari RFC)
Ini adalah objek JSON:
Anggota Image-nya adalah objek yang anggota thumbnail-nya adalah objek dan anggota ID-nya adalah array angka.
Betulkah?
sumber
Object
, itu aString
. Terima kasihSejauh yang saya mengerti perbedaan utama adalah fleksibilitas .
JSON adalah sejenis pembungkus pada "JavaScript Object Notation" yang memaksa pengguna untuk mematuhi aturan yang lebih ketat untuk mendefinisikan objek. Dan ia melakukan ini dengan membatasi kemungkinan cara deklarasi objek yang disediakan oleh fitur Notasi Objek JavaScript.
Sebagai hasilnya kami memiliki objek yang lebih sederhana dan lebih terstandarisasi yang lebih cocok untuk pertukaran data antar platform.
Jadi pada dasarnya, newObject dalam contoh saya di atas adalah objek yang didefinisikan dengan menggunakan JavaScript Objeect Notation; tetapi ini bukan objek JSON 'valid' karena tidak mengikuti aturan yang disyaratkan standar JSON.
Tautan ini juga cukup membantu: http://msdn.microsoft.com/en-us/library/bb299886.aspx
sumber
Pertama, Anda harus tahu apa itu JSON:
Ini adalah format pertukaran data agnostik bahasa. Sintaks JSON terinspirasi oleh notasi JavaScript Object Literal, tetapi ada perbedaan di antara mereka.
Misalnya, dalam JSON semua kunci harus dikutip, sedangkan dalam objek literal ini tidak perlu:
// JSON: {"foo": "bar"}
// Objek literal: var o = {foo: "bar"}; Kutipan tersebut wajib di JSON karena dalam JavaScript (lebih tepatnya dalam ECMAScript 3rd. Edition), penggunaan kata-kata yang dipesan sebagai nama properti tidak diizinkan, misalnya:
var o = {if: "foo"}; // SyntaxError di ES3 While, menggunakan string literal sebagai nama properti (mengutip nama properti) tidak memberikan masalah:
var o = {"if": "foo"}; Jadi untuk "kompatibilitas" (dan mungkin evaluasi mudah?) Tanda kutip adalah wajib.
Tipe data dalam JSON juga dibatasi untuk nilai-nilai berikut:
string number array objek A literal sebagai: true false null Tata bahasa Strings berubah. Mereka harus dibatasi oleh tanda kutip ganda, sedangkan dalam JavaScript, Anda dapat menggunakan tanda kutip tunggal atau ganda secara bergantian.
// JSON Tidak Valid: {"foo": 'bar'} Tata bahasa Bilangan JSON yang diterima juga berubah, dalam JavaScript Anda dapat menggunakan Heksadesimal Literal, misalnya 0xFF, atau (yang terkenal) Oktal Literals misalnya 010. Dalam JSON Anda dapat menggunakan hanya Literal Desimal.
// JSON Tidak Valid: {"foo": 0xFF}
sumber
Literal Obyek Javascript vs JSON:
JSON
bahasa, yang merupakan singkatan dari 'notasi objek Javascript', memiliki sintaks yang berasal dari objek javascript sintaks literal. Ini digunakan sebagai bahasa pemrograman format transfer data tekstual independen.Contoh:
Notasi objek JS, digunakan dalam JS untuk membuat objek dalam kode dengan mudah:
Contoh JSON:
Perbedaan utama:
Semua kunci objek di JSON harus berupa string. Dalam Javascript objek kunci bisa berupa string atau angka
Semua string dalam JSON harus dikutip dalam "tanda kutip ganda". Sedangkan dalam Javascript, baik harga tunggal maupun ganda, diperbolehkan. Bahkan tanpa tanda kutip dalam notasi objek Javascript kunci objek secara implisit dilemparkan ke string.
Dalam JSON fungsi tidak dapat didefinisikan sebagai nilai objek (karena ini adalah Javascript khusus). Dalam Javascript ini sepenuhnya legal.
JSON
Objek build Javascript :JSON
objek dapat dengan mudah dikonversi ke Javascript dan sebaliknya menggunakanJSON
objek bawaan yang ditawarkan Javascript dalam runtime-nya. Sebagai contoh:sumber
Berikut ini satu perbedaan yang mengejutkan: Anda tidak dapat menggunakan
undefined
json dan semua bidang objek dengan nilai yang tidak ditentukan akan hilang setelahnyaJSON.stringify
🙈🙉🙊
sumber