Jika saya mengonversi objek di atas ke menggunakan JSON var jSonString = JSON.stringify(testObject);
, apa perbedaan antara 2 (JS obj dan JSON)?
JSON adalah format pertukaran data. Ini adalah standar yang menjelaskan bagaimana daftar yang diurutkan dan peta yang tidak berurutan, string boolean, dan angka dapat direpresentasikan dalam string. Sama seperti XML dan YAML adalah cara untuk menyampaikan informasi terstruktur antar bahasa, JSON juga sama. Objek JavaScript di sisi lain adalah tipe fisik. Sama seperti array PHP, kelas C ++ / struct, objek JavaScript adalah tipe internal untuk JavaScript.
Ini sebuah cerita. Bayangkan Anda membeli beberapa perabot dari toko, dan Anda menginginkannya dikirim. Namun satu-satunya yang tersisa dalam stok adalah model tampilan, tetapi Anda setuju untuk membelinya.
Di toko, laci yang Anda beli adalah benda hidup:
var chestOfDrawers = {
color: "red",
numberOfDrawers: 4
}
Namun, Anda tidak dapat mengirim peti laci di pos, sehingga Anda membongkarnya (baca, sesuaikan). Sekarang tidak berguna dalam hal furnitur. Sekarang JSON. Ini dalam bentuk paket datar.
{"color":"red","numberOfDrawers":4}
Ketika Anda menerimanya, Anda kemudian membangun kembali lemari laci (baca, parsing). Sekarang kembali dalam bentuk objek.
Alasan di balik JSON / XML dan YAML adalah untuk memungkinkan data ditransfer antara bahasa pemrograman dalam format yang dapat dipahami oleh kedua bahasa yang berpartisipasi; Anda tidak bisa memberikan PHP atau C ++ objek JavaScript Anda secara langsung; karena setiap bahasa merepresentasikan objek secara berbeda di bawah kap. Namun, karena kami telah merender objek menjadi notasi JSON; yaitu cara standar untuk merepresentasikan data, kita dapat mengirimkan representasi JSON objek ke bahasa lain (C ++, PHP), mereka dapat membuat ulang objek JavaScript yang kita miliki ke objek mereka sendiri berdasarkan pada representasi JSON objek.
Penting untuk dicatat bahwa JSON tidak dapat mewakili fungsi atau tanggal. Jika Anda mencoba untuk mengencangkan objek dengan anggota fungsi, fungsi tersebut akan dihapus dari representasi JSON. Tanggal akan dikonversi menjadi string;
JSON.stringify({
foo: new Date(),
blah: function () {
alert('hello');
}
}); // returns the string "{"foo":"2011-11-28T10:21:33.939Z"}"
T1: Saat mendefinisikan objek literal dalam javascript, kunci dapat menyertakan tanda kutip atau tidak. Tidak ada perbedaan kecuali bahwa kutipan memungkinkan Anda untuk menentukan kunci tertentu yang akan menyebabkan penerjemah gagal untuk menguraikan jika Anda mencobanya telanjang. Misalnya, jika Anda menginginkan kunci yang hanya merupakan tanda seru, Anda perlu mengutip:
Namun dalam kebanyakan kasus, Anda dapat menghilangkan tanda kutip di sekitar tombol pada objek literal.
T2: JSON secara harfiah adalah representasi string. Itu hanya sebuah string. Jadi, pertimbangkan ini:
Karena
testObject
ini adalah objek nyata, Anda dapat memanggil properti di atasnya dan melakukan hal lain yang dapat Anda lakukan dengan objek:Di sisi lain,
jsonString
hanyalah sebuah string:Perhatikan satu perbedaan lain: Di JSON, semua kunci harus dikutip. Itu kontras dengan objek literal, di mana kutipan biasanya dapat dihilangkan sesuai penjelasan saya di Q1.
Q3. Anda dapat mengurai string JSON dengan menggunakan
JSON.parse
, dan ini umumnya cara terbaik untuk melakukannya (jika browser atau kerangka menyediakannya). Anda juga dapat menggunakaneval
karena JSON adalah kode javascript yang valid, tetapi metode sebelumnya direkomendasikan karena beberapa alasan (eval memiliki banyak masalah buruk yang terkait dengannya).sumber
Masalah dipecahkan oleh JSON
Katakanlah Anda ingin bertukar objek JavaScript biasa antara dua komputer, dan Anda menetapkan dua aturan:
Sekarang Anda membuat dua objek pada host pertama:
Bagaimana Anda bisa mengubah benda-benda itu menjadi string untuk transmisi ke host kedua?
'{ one: 1,"two":2,"three":3 }'
, tetapi sebenarnya Anda tidak dapat membaca literal di bagian skrip dokumen (setidaknya tidak mudah). Jadiobj1
danobj2
harus benar-benar diproses dengan cara yang sama.JSON telah dibuat sebagai solusi untuk kebutuhan yang baru saja dibahas: Ini adalah seperangkat aturan untuk membuat string yang setara dengan objek dengan mendaftar semua atribut dan nilai (metode diabaikan).
JSON menormalkan penggunaan tanda kutip ganda untuk nama atribut dan nilai.
Ingatlah bahwa JSON adalah seperangkat aturan saja (standar).
Berapa banyak objek JSON yang dibuat?
Hanya satu, itu secara otomatis dibuat oleh mesin JS.
Mesin JavaScript modern yang ditemukan di browser memiliki objek asli, juga bernama JSON. Objek JSON ini mampu:
Dekode string yang dibangun menggunakan standar JSON, menggunakan JSON.parse (string). Hasilnya adalah objek JS biasa dengan atribut dan nilai yang ditemukan di string JSON.
Encode atribut / nilai objek JS biasa menggunakan JSON.stringify (). Hasilnya adalah string yang sesuai dengan aturan JSON.
Objek (tunggal) JSON mirip dengan codec, fungsinya adalah untuk menyandikan dan mendekode.
Perhatikan bahwa:
JSON.parse () tidak membuat objek JSON, ia menciptakan objek JS biasa, tidak ada perbedaan antara objek yang dibuat menggunakan objek literal dan objek yang dibuat oleh JSON.parse () dari string yang sesuai dengan JSON.
Hanya ada satu objek JSON, yang digunakan untuk semua konversi.
Kembali ke pertanyaan :
Q1: Penggunaan tanda kutip ganda diizinkan untuk objek literal. Perhatikan bahwa tanda kutip digunakan secara opsional untuk nama atribut, dan wajib untuk nilai string. Objek literal itu sendiri tidak dikelilingi oleh tanda kutip.
T2: Objek yang dibuat dari literal dan menggunakan JSON.parse () benar-benar sama. Kedua objek ini setara setelah dibuat:
var obj1 = { one: 1, "two": 2, "three": 3 };
var obj2 = JSON.parse('{ "one": "1", "two": "2", "three": "3" }');
T3: Pada browser modern
JSON.parse()
digunakan untuk membuat objek JS dari string yang sesuai dengan JSON. (jQuery juga memiliki metode setara yang dapat digunakan untuk semua browser).sumber
Q1 - di JS Anda hanya perlu menggunakan tanda kutip jika kuncinya adalah kata yang dipesan atau jika itu akan menjadi token ilegal. Di JSON Anda HARUS selalu menggunakan tanda kutip ganda pada nama-nama kunci.
Q2 -
jsonString
adalah versi serial objek input ...Q3 - yang dapat di- deserialised ke objek yang tampak identik menggunakan
JSON.parse()
sumber
Pertanyaan sudah memiliki jawaban yang bagus, saya menambahkan contoh kecil di bawah ini, yang akan membuatnya lebih mudah untuk memahami penjelasan yang diberikan dalam jawaban sebelumnya. Salin tempel di bawah cuplikan ke IDE Anda untuk pemahaman yang lebih baik dan komentar baris yang berisi
invalid_javascript_object_no_quotes
deklarasi objek untuk menghindari kesalahan waktu kompilasi.sumber