JSON ve Nesne Değişmez Gösterimi arasındaki fark nedir?


221

Birisi bana Object Literal Notation ve JSON nesnesi kullanılarak tanımlanan bir JavaScript nesnesi arasındaki temel farkın ne olduğunu söyleyebilir mi?

Bir JavaScript kitabına göre, bunun Nesne Gösterimi kullanılarak tanımlanan bir nesne olduğunu söylüyor :

var anObject = {
    property1 : true,
    showMessage : function (msg) { alert(msg) }
};

Bu durumda neden bir JSON nesnesi değil? Tırnak işaretleri kullanılarak tanımlanmadığı için mi?


20
"Neden bu durumda bir JSON nesnesi değil?": Çünkü anahtarlarınız dize olmalı ve bir işlev geçerli bir JSON değeri değil.
Matt

Yanıtlar:


248

Öncelikle JSON'un gerçekte ne olduğunu açıklayalım . JSON bir metinsel XML, CSV veya YAML gibi , dilden bağımsız bir veri alışverişi biçimidir.

Veriler birçok şekilde saklanabilir, ancak bir metin dosyasında saklanması ve bir bilgisayar tarafından okunabilmesi gerekiyorsa, bazı yapıları izlemesi gerekir. JSON, böyle bir yapıyı tanımlayan birçok formattan biridir.

Bu tür biçimler genellikle dilden bağımsızdır, yani Java, Python, JavaScript, PHP tarafından işlenebilirler, adını siz verin.

Aksine, JavaScript bir programlama dilidir. Elbette JavaScript, verileri tanımlamak / tanımlamak için bir yol sağlar, ancak sözdizimi JavaScript'e çok özgüdür.

Karşı örnek olarak, Python tuples kavramına sahiptir, sözdizimi (x, y). JavaScript böyle bir şeye sahip değildir.


JSON ve JavaScript nesne değişmez değerleri arasındaki sözdizimsel farklılıklara bakalım.

JSON aşağıdaki sözdizimsel kısıtlamalarına sahiptir:

  • Nesne anahtarları dize olmalıdır (örn. Çift tırnak içine alınmış bir karakter dizisi" ).
  • Değerler şunlardan biri olabilir:
    • dizi
    • bir sayı
    • bir (JSON) nesnesi
    • bir dizi
    • true
    • false
    • null
  • Yinelenen anahtarlar ( {"foo":"bar","foo":"baz"}) tanımsız, uygulamaya özgü sonuçlar üretir; JSON belirtimi özellikle anlambilimlerini tanımlamaz

JavaScript'te, nesne değişmezleri

  • Dize değişmezleri, sayı değişmezleri veya tanımlayıcı adları anahtar olarak (ES6'dan beri, artık başka bir sözdizimi getiren anahtarlar da hesaplanabilir).
  • Değerler, işlev tanımları ve dahil olmak üzere geçerli herhangi bir JavaScript ifadesi olabilir undefined.
  • Yinelenen tuşlar tanımlı, belirtilen sonuçlar üretir (gevşek modda, ikinci tanım öncekinin yerini alır; katı modda bu bir hatadır).

Bunu bilmek, sadece sözdizimine bakarak, örneğin iki nedenden dolayı JSON değildir:

  1. Anahtarlarınız dize (değişmez) değil. Bunlar tanımlayıcı isimlerdir .
  2. Bir işlevi "JSON nesnesine" değer olarak atayamazsınız (çünkü JSON işlevler için herhangi bir sözdizimi tanımlamaz).

Ama en önemlisi, açıklamamı en baştan tekrarlamak için: Bir JavaScript bağlamındasınız. Bir JavaScript nesnesi tanımlarsınız. Varsa, bir "JSON nesnesi" yalnızca bir dizede bulunabilir:

 var obj = {foo: 42}; // creates a JavaScript object (this is *not* JSON)
 var json = '{"foo": 452}'; // creates a string containing JSON

Yani, JavaScript kaynak kodu yazıyor ve bir dize ile ilgilenmiyorsanız JSON ile ilgilenmiyorsunuz. Verileri JSON olarak aldınız (örneğin, ajax veya bir dosyadan okuma yoluyla), ancak siz veya kullandığınız bir kitaplık ayrıştırıldıktan sonra artık JSON değildir.


Yalnızca nesne değişmez değerleri ve JSON benzer göründükleri için, bunları birbirlerinin yerine adlandırabileceğiniz anlamına gelmez. Ayrıca bkz . "JSON Nesnesi" diye bir şey yoktur .


8
Ayrıca JSON'un Nesne Değişmez Gösteriminin bir alt kümesi olduğunu unutmayın
Sean Kinsey,

14
@SeanKinsey: Bunun dışında: timelessrepo.com/json-isnt-a-javascript-subset
mpen

1
Genellikle yorumların yasal olduğu bir bağlamda bir JavaScript nesnesi değişmezi beklediğinizi ve JSON spesifikasyonunun yorumlara izin vermediğini belirtmek gerekir ( bu
Brian Henry

"" kullansanız da kullanmasanız da, nesne değişmezindeki anahtarlar her zaman dizedir.
16'da

2
@overexchange: "nesne değişmezindeki anahtarlar her zaman dizgidir " Burada iki şeyi karıştırıyorsunuz, ama sizi suçlayamam çünkü burada da net bir çizgi çizmedim. Bir nesne değişmez değeri ile bir nesne değeri arasında ayrım yapmanız gerekir . Bir edebi kaynak kodunda yazmak karakter dizisidir. Değeri kaynak kodunu yorumlayarak yarattı şeydir. Değişmez nesne (sözdizimi), tanımlayıcı adları , dize değişmez değerleri veya sayı değişmez değerleri kullanmanızı sağlar . Çalışma zamanında, bunların tümünün dizelere dönüştürüldüğünü haklıyorsunuz (ancak şimdi de sembollerimiz var).
Felix Kling

41

JSON çok daha sınırlı bir sözdizimine sahiptir:

  • Anahtar değerler alıntılanmalıdır
  • Dizeler ile tırnak içinde olmalıdır "ve'
  • Daha sınırlı bir değer aralığınız var (örneğin, işlevlere izin verilmiyor)

1
Bu "hiçbir işlev İzin verildi" sevdim.
Karan Kaw

Yorumlara da izin verilmiyor. Şüpheli nedenlerden dolayı. (Heard onları birkaç kez sorguladılar.) Bu şimdiye "derdi ana farktır.
user7610

15

Gerçekten "JSON Nesnesi" diye bir şey yoktur.

JSON spec, verileri dize olarak kodlamak için kullanılan bir sözdizimidir. İnsanların "JSON Nesnesi" (javascript içinde) dediği şey gerçekten sadece (muhtemelen) geçerli bir JSON dizesinden serileştirilmiş sıradan bir javascript nesnesidir ve geçerli bir JSON dizesi olarak kolayca yeniden serileştirilebilir. Bu genellikle yalnızca veri içerdiği anlamına gelir (işlevler değil). Ayrıca tarih olmadığı anlamına gelir, çünkü JSON bir tarih türüne sahip değildir (muhtemelen JSON hakkında en acı verici şey;)

Dahası, (yan sıra ...) insanlar bir "JSON Nesnesi" hakkında konuşurken, neredeyse her zaman en üst düzeyde "kıvırcık parantez" olan veri anlamına gelir. Bu güzel bir javascript nesnesine karşılık gelir. Ancak, JSON spec bir JSON dizesinin üst düzeyinde tek bir "kıvırcık parantez" nesnesi olmasını gerektirmez. En üst düzeyde bir listeye sahip olmak, hatta tek bir değere sahip olmak JSON için tamamen geçerli. Dolayısıyla, her "JSON Nesnesi" geçerli JSON'a karşılık gelirken, tüm geçerli JSON dizeleri "JSON Nesnesi" dediğimiz şeye karşılık gelmez! (çünkü dize bir listeyi veya atomik bir değeri temsil edebilir)


5
Cevabınızda bir hata var: JSON en üst düzeyde bir atom değerine sahip olmak geçersiz . JSON, üst kısmın bir nesne veya dizi olmasına izin verir, ancak başka bir şey değildir. Standart RFC4627 , JSON'un dilbilgisini şu şekilde açıklamaktadır JSON-text = object / array.
Rory O'Kane

9

JavaScript'teki JSON'a göre ,

JSON, JavaScript'in gerçek nesne gösteriminin bir alt kümesidir .

Başka bir deyişle, geçerli JSON, geçerli bir JavaScript nesnesi değişmez gösterimidir, ancak tam tersi değildir.

@Filix King'in önerdiği gibi belgeleri okumaya ek olarak, JSONLint çevrimiçi JSON doğrulayıcı ile oynamanızı da öneriyorum . Bu şekilde JSON nesnelerinin anahtarlarının dizeler olması gerektiğini öğrendim.


2
Dikkat edin: Tam bir alt küme değildir , JS nesnesi değişmezleri olarak geçersiz olan bazı JSON dizeleri vardır
Bergi

5

ON JSON : XML'e Yağsız Alternatif

JSON, dağıtılmış uygulamalar ve hizmetler üretmeyi çok daha kolay hale getiren kişiler tarafından yaygın bir şekilde benimsenmiştir. JSON için resmi İnternet medyası türü application/json RFC 4627. JSON dosya adları uzantıyı kullanır .json.


► JavaScript Nesne Gösterimi ( JSON) hafif, metin tabanlı, dilden bağımsız bir veri değişim biçimidir. JSON, herhangi bir Programlama dilinde yazılmış uygulamalar arasında veri alışverişi için kullanılmıştır.

JSON nesnesi, JSON metinlerini ayrıştırmak ve oluşturmak için kullanılan iki işlevi ayrıştırıp dizgi içeren tek bir nesnedir.

  • JSON.stringify, aşağıdaki JSON dilbilgisine uyan bir Dize üretir.
  • JSON.parse, JSON dilbilgisine uyan bir String'i kabul eder.

ParseJSON yöntemi Fourth Edition of ECMAScript. Bu arada, json.org'da bir JavaScript uygulaması bulunmaktadır.

var objLiteral = {foo: 42}; // JavaScript Object
console.log('Object Literal : ', objLiteral ); // Object {foo: 42}foo: 42__proto__: Object

// This is a JSON String, like what you'd get back from an AJAX request.
var jsonString = '{"foo": 452}';
console.log('JOSN String : ', jsonString ); // {"foo": 452}

// This is how you deserialize that JSON String into an Object.
var serverResposnceObject = JSON.parse( jsonString );
console.log('Converting Ajax response to JavaScript Object : ', serverResposnceObject); // Object {foo: 42}foo: 42 __proto__: Object

// And this is how you serialize an Object into a JSON String.
var serverRequestJSON = JSON.stringify( objLiteral );
console.log('Reqesting server with JSON Data : ', serverRequestJSON); // '{"foo": 452}'

JSON, JavaScript'in alt kümesidir. Javascript , ECMAScript Programlama Dili Standardından türetilmiştir.


► ECMAScript

ECMAScript dünyanın en yaygın kullanılan genel amaçlı programlama dillerinden biri haline gelmiştir. En iyi web tarayıcılarına gömülü dil olarak bilinir, ancak sunucu ve gömülü uygulamalar için de yaygın olarak benimsenmiştir. ECMAScript, en iyi bilinen JavaScript(Netscape Communications)) ve JScript(Microsoft Corporation) gibi çeşitli kaynak teknolojilerine dayanmaktadır . 1994'ten önce ECMA, "Avrupa Bilgisayar Üreticileri Birliği" olarak bilinmesine rağmen, kuruluşun küreselleştiği 1994'ten sonra "ticari marka" "Ecma" tarihi nedenlerden ötürü tutuldu.

ECMAScript dildir, ancak JavaScript, JScript ve hatta ActionScript çağrılır "Dialects".

Lehçeler aynı dilden türetilmiştir. Aynı dilden türetildikleri için birbirlerine oldukça benzerler, ancak bazı değişikliklerden geçtiler. Bir lehçe, dilin kendisinin bir varyasyonudur. Tek bir dilden türetilmiştir.

  • SQL Dili - Bazı değişiklikler veya işlevler eklenmiş olan Hibernate MySQL Dialect, Oracle Dialect, ..

Kullanıcılarınızın tarayıcısı ve bilgisayarı hakkında bilgi.

navigator.appName // "Netscape"

ECMAScript, JavaScript'in temelini oluşturan komut dosyası dilidir. .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.

NOT « Çalışma tamamlanmadığı için ECMAScript'in 4. baskısı yayınlanmamıştır .


JSON, yapılandırılmış verilerin taşınabilir temsili için küçük bir biçimlendirme kuralı kümesi tanımlar.

  1. ► Anahtar değerler belirtilmelidir, anahtarlar için yalnızca Dizgilere izin verilir. String dışında bir kullanırsanız, String'e dönüştürülür. Ancak Dize dışındaki anahtarların kullanılması önerilmez. Böyle bir örnek kontrol edin - { 'key':'val' }overRFC 4627 - jsonformatter

    var storage = {
      0 : null,
      1 : "Hello"
    };
    console.log( storage[1] ); // Hello
    console.log( JSON.stringify( storage ) ); // {"0":null,"1":"Hello","2":"world!"}
    
    var objLiteral = {'key1':'val1'};
        var arr = [10, 20], arr2 = [ 'Yash', 'Sam' ];
        var obj = { k: 'v' }, obj2 = { k2: 'v2' };
        var fun = function keyFun() {} ;
    
    objLiteral[ arr ] = 'ArrayVal';     objLiteral[ arr2 ] = 'OverridenArrayVal';
    objLiteral[ obj ] = 'ObjectVal';    objLiteral[ obj2 ] = 'OverridenObjectVal';
    objLiteral[ fun ] = 'FunctionVal';
    
    console.log( objLiteral );
    // Object {key1: "val1", 10,20: "ArrayVal", Yash,Sam: "OverridenArrayVal", [object Object]: "OverridenObjectVal", function keyFun() {}: "FunctionVal"}
    console.log( JSON.stringify( objLiteral ) );
    // {"key1":"val1","10,20":"ArrayVal","Yash,Sam":"OverridenArrayVal","[object Object]":"OverridenObjectVal","function keyFun() {}":"FunctionVal"}
    console.log( JSON.parse( JSON.stringify( objLiteral ) ) );
    // Object {key1: "val1", 10,20: "ArrayVal", Yash,Sam: "OverridenArrayVal", [object Object]: "OverridenObjectVal", function keyFun() {}: "FunctionVal"}
    
    console.log('Accessing Array  Val : ', objLiteral[ [10,20] ] );
    console.log('Accessing Object Val : ', objLiteral[ '[object Object]' ] );
    console.log('Accessing Function Val : ', objLiteral[ 'function keyFun() {}' ] );
  2. ► JSON Dizeleri "ile değil" ile tırnak içine alınmalıdır. Bir dize C veya Java dizgisine çok benzer. Dizeler çift tırnak içine alınmalıdır.

    • Değişmez değerler, betiğinizde tam olarak sağladığınız değişkenler değil sabit değerlerdir.
    • Bir dize, çoğu programlama dilinde kullanılan aynı gösterim olan ters eğik çizgi çıkışıyla tırnak içine alınmış sıfır veya daha fazla karakterden oluşan bir dizidir.
      • 🔫 - Dizede Özel Sembollere izin verilir ancak kullanılması önerilmez.
      • \ "- Özel karakterler kaçabilir. Ancak tek tırnaktan kaçmak için tavsiye edilmez. Katı modda fırlar ve Hata - SyntaxError: Unexpected token ' in JSON

    { "Hai\" \n Team 🔫":5, "Bye \'": 7 }Çevrimiçi JSON Edtions üzerinden bu kodu kontrol edin .ModesnotStrict,Strinct.

    var jsonString = "{'foo': 452}"; // {'foo': 452}
    var jsonStr = '{"foo": 452}'; // {"foo": 452}
    
    JSON.parse( jsonString ); // Unexpected token ' in JSON at position 1(…)
    JSON.parse( jsonStr ); // Object {foo: 452}
    
    objLiteral['key'] = 'val'; // Object {foo: 42, key: "val"}
    objLiteral.key2 = 'val';
    
    // objLiteral.key\n3 - SyntaxError: Invalid or unexpected token
    objLiteral['key\n3'] = 'val'; // Object {"foo": "42", key: "val", key2: "val", "key↵3": "val"}
    
    JSON.stringify( objLiteral ); // {"foo":"42","key":"val","key2":"val","key\n3":"val"}

Nesne Özellik erişimcileri , nokta gösterimini veya köşeli ayraç gösterimini kullanarak bir nesnenin özelliklerine erişim sağlar.

  1. ► Daha sınırlı bir değer aralığınız vardır (örn. Fonksiyona izin verilmez). Değer, çift tırnak, sayı, boole, null, nesne veya dizi içindeki bir dize olabilir. Bu yapılar yuvalanabilir.

    var objLiteral = {};
    objLiteral.funKey = function sayHello() {
        console.log('Object Key with function as value - Its outcome message.');
    };
    
    objLiteral['Key'] = 'Val';
    
    console.log('Object Literal Fun : ', objLiteral );
    // Object Literal Fun :  Object {Key: "Val"}Key: "Val"funKey: sayHello()__proto__: Object
    console.log( JSON.stringify( objLiteral ) ); // {"Key":"Val"}

resim açıklamasını buraya girin


JavaScriptECMAScript Standardının en popüler uygulamasıdır. Javascript'in temel özellikleri ECMAScript standardını temel alır, ancak Javascript ayrıca ECMA spesifikasyonlarında / standardında olmayan başka ek özelliklere de sahiptir. Her tarayıcının bir JavaScript tercümanı vardır.

JavaScript, dinamik olarak yazılmış bir dildir. Bu, değişkeni bildirirken bir veri türünü belirtmeniz gerekmediği ve komut dosyası yürütülürken veri türlerinin gerektiği gibi otomatik olarak dönüştürüldüğü anlamına gelir.

Literals :

'37' - 7    // 30
'37' + 7    // "377"
+'37' + 7   // 44
+'37'       // 37
'37'        // "37"

parseInt('37');     // 37
parseInt('3.7');    // 3

parseFloat(3.7);    // 3.7

// An alternative method of retrieving a number from a string is with the + (unary plus) operator:
+'3.7'              // 3.7

Object literals RFC 7159

Bir nesne yapısı, sıfır veya daha fazla ad / değer çiftini (veya üyeyi) çevreleyen bir çift süslü parantez olarak temsil edilir. Ad bir dizedir. Her addan sonra, adı değerden ayıran tek bir iki nokta üst üste gelir. Tek bir virgül, bir değeri aşağıdaki addan ayırır. Bir nesnenin içindeki adlar benzersiz olmalıdır.

ECMAScript prototip tabanlı kalıtımı destekler. Her kurucunun ilişkili bir prototipi vardır ve bu kurucu tarafından oluşturulan her nesnenin, kurucusuyla ilişkili prototip (nesnenin prototipi denir) için örtük bir başvurusu vardır. Ayrıca, bir prototip, prototipine null olmayan örtük bir referansa sahip olabilir; buna prototip zinciri denir.

Sınıfa dayalı nesne yönelimli bir dilde, genel olarak, durum örneklere göre taşınır, yöntemler sınıflar tarafından taşınır ve kalıtım yalnızca yapı ve davranıştan ibarettir. ECMAScript'te durum ve yöntemler nesneler tarafından taşınır ve yapı, davranış ve durumun tümü miras alınır.

Prototip, ECMAScript'te yapı, durum ve davranış mirasını uygulamak için kullanılan bir nesnedir. Bir kurucu bir nesne oluşturduğunda, o nesne, özellik referanslarını çözümlemek amacıyla kurucunun ilişkili prototipine dolaylı olarak başvurur. Yapıcı ile ilişkili prototip, program ifadesi constructor.prototype tarafından başvurulabilir ve bir nesnenin prototipine eklenen özellikler, miras yoluyla, prototipi paylaşan tüm nesneler tarafından paylaşılır.


2

RFC'nin bloglardan ve fikir tabanlı yanlış anlamalardan daha önemli olduğunu düşünenler için, bazı noktaları açıklığa kavuşturmaya çalışalım. Önceki cevaplarda belirtilen tüm doğru farklılıkları tekrarlamayacağım, burada sadece bazı önemli kısmı özetleyen değer katmaya çalışıyorum rfc7159

Https://tools.ietf.org/html/rfc7159 adresinden alıntılar

  1. JavaScript Nesne Gösterimi (JSON), yapılandırılmış verilerin serileştirilmesi için bir metin biçimidir. ECMAScript Programlama Dili Standardı, Üçüncü Baskı [ECMA-262] 'de tanımlandığı gibi JavaScript nesne değişmezlerinden türetilmiştir .
  2. JSON dört ilkel türü (dizeler, sayılar, booleans ve null) ve iki yapısal türü ( nesneler ve diziler) temsil edebilir.
  3. Bir nesnenin bir isim, bir dizi sıfır ya da daha fazla isim / değer çiftleri arasında sırasız koleksiyondur ve bir değeri bir dize, sayı, mantıksal, boş olan nesne ya da bir dizi.
  4. başlangıç ​​nesnesi = ws% x7B ws; {sol kıvrık ayraç
  5. son nesne = ws% x7D ws; } sağ kıvrık ayraç
  6. JSON değeri bir nesne , dizi, sayı veya dize veya aşağıdaki üç değişmez addan biri OLMALIDIR : false null true
  7. Bir nesne yapısı bir çift kıvrık parantez olarak temsil edilir
  8. Bir nesnenin içindeki adlar benzersiz olmalıdır. object = begin-object [üye * (değer ayırıcı üye)] son nesne
  9. İsimleri benzersiz olan bir nesne , bu nesneyi alan tüm yazılım uygulamalarının ad-değer eşlemeleri üzerinde anlaşmaya varması anlamında birlikte çalışabilir . Bir nesnenin içindeki adlar benzersiz olmadığında, böyle bir nesneyi alan yazılımın davranışı tahmin edilemez.
  10. Örnekler (RFC'nin 12. sayfasından)

    Bu bir JSON nesnesidir:

          {
            "Image": {
                "Width":  800,
                "Height": 600,
                "Title":  "View from 15th Floor",
                "Thumbnail": {
                    "Url":    "http://www.example.com/image/481989943",
                    "Height": 125,
                    "Width":  100
                },
                "Animated" : false,
                "IDs": [116, 943, 234, 38793]
              }
          }

    Resim üyesi, Küçük Resim üyesi bir nesne olan ve kimlik üyeleri bir sayı dizisi olan bir nesnedir .

Gerçekten "JSON Nesnesi" diye bir şey yoktur.

Gerçekten mi?


1
Davi, bu bir değil Object, bir String. Teşekkürler
abu abu

1

Anladığım kadarıyla ana fark esneklik .

JSON, kullanıcıları nesneleri tanımlamak için daha katı kurallara uymaya zorlayan "JavaScript Nesne Notasyonu" üzerine bir tür sarıcıdır. Bunu, JavaScript Nesne Gösterimi özelliği tarafından sağlanan olası nesne bildirim yollarını sınırlandırarak yapar.

Sonuç olarak, platformlar arasında veri alışverişine daha iyi uyan daha basit ve daha standartlaştırılmış nesnelerimiz var.

Temel olarak, yukarıdaki örneğimdeki newObject, JavaScript Objeect Notation kullanılarak tanımlanan bir nesnedir; ancak JSON standartlarının gerektirdiği kurallara uymadığı için 'geçerli' bir JSON nesnesi değildir.

Bu bağlantı da oldukça yararlı: http://msdn.microsoft.com/en-us/library/bb299886.aspx


2
JSON ve nesne gösteriminin amacı tamamen farklıdır: birincisi yalnızca veri alışverişi için kullanılır ve ikincisi yalnızca dahili kullanım için JS nesneleri oluşturmak içindir. Aynı şeyin gittikçe daha katı sürümleri değildir.
ilyo

0

İlk önce JSON'un ne olduğunu bilmelisiniz:

Bu dil agnostik veri değişim biçimidir. JSON sözdiziminden JavaScript Nesnesi Değişmez gösteriminden ilham alınmıştır, ancak aralarında farklar vardır.

Örneğin, JSON'da tüm anahtarların alıntılanması gerekirken, nesne değişmezlerinde bu gerekli değildir:

// JSON: {"foo": "çubuk"}

// Nesne değişmez değeri: var o = {foo: "bar"}; Alıntılar JSON'da zorunludur, çünkü JavaScript'te (daha ayrıntılı olarak ECMAScript 3. Sürümünde), ayrılmış kelimelerin özellik adları olarak kullanılmasına izin verilmez, örneğin:

var o = {if: "foo"}; // ES3'te SyntaxError, özellik adı olarak bir dize değişmezi kullanmak (özellik adını alıntılamak) sorun oluşturmaz:

var o = {"if": "foo"}; Yani "uyumluluk" (ve belki de kolay değerlendirme) için alıntılar zorunludur.

JSON'daki veri türleri de aşağıdaki değerlerle sınırlıdır:

dize numarası nesne dizisi Bir değişmez değer: true false null Dizelerin dilbilgisi değişir. JavaScript'te çift tırnak ile sınırlandırılmaları gerekirken, JavaScript'te tek veya çift tırnakları birbirinin yerine kullanabilirsiniz.

// Geçersiz JSON: {"foo": 'bar'} Kabul edilen Sayılar JSON dilbilgisi de değişir, JavaScript'te Onaltılık Değişmezleri, örneğin 0xFF'yi veya (rezil) Sekizgen Değişmezleri örneğin 010'u kullanabilirsiniz. JSON'da kullanabilirsiniz yalnızca Ondalık Değişmez Değerler.

// Geçersiz JSON: {"foo": 0xFF}


0

Javascript Nesne Değişmezi vs JSON:

  • Nesne hazır sözdizimi, javascript nesneleri oluşturmanın çok uygun bir yoludur
  • JSON'Javascript nesne gösterimi' anlamına gelen dilin sözdizimi javascript nesne değişmez söz diziminden türetilmiştir. Programlama dilinden bağımsız metinsel veri aktarım formatı olarak kullanılır.

Misal:

JS'da, kodda nesneleri kolayca oluşturmak için kullanılan JS nesne gösterimi:

const JS_Object = {
  1: 2,  // the key here is the number 1, the value is the number 2
  a: 'b', // the key is the string a, the value is the string b
  func: function () { console.log('hi') }
  // the key is func, the value is the function
}

JSON örneği:

{"widget": {
    "debug": "on",
    "window": {
        "title": "Sample Konfabulator Widget",
        "name": "main_window",
        "width": 500,
        "height": 500
    },
    "image": { 
        "src": "Images/Sun.png",
        "name": "sun1",
        "hOffset": 250,
        "vOffset": 250,
        "alignment": "center"
    },
    "text": {
        "data": "Click Here",
        "size": 36,
        "style": "bold",
        "name": "text1",
        "hOffset": 250,
        "vOffset": 100,
        "alignment": "center",
        "onMouseUp": "sun1.opacity = (sun1.opacity / 100) * 90;"
    }
}}

Temel farklar:

  • JSON'daki tüm nesne anahtarları dize olmalıdır. Javascript nesne anahtarları dizeler veya sayılar olabilir

  • JSON içindeki tüm dizeler "çift tırnak" içinde belirtilmelidir. Oysa Javascript'te hem tek tırnak hem de çift tırnak kullanılabilir. Javascript nesne gösterimlerinde tırnak işareti olmasa bile, nesne anahtarları dolaylı olarak dizelere dökülür.

  • JSON'da bir işlev bir nesnenin değeri olarak tanımlanamaz (çünkü bu Javascript'e özeldir). Javascript'te bu tamamen yasaldır.

JSONNesnede Javascript oluşturma :

JSONNesneleri, JSONJavascript'in çalışma zamanında sunduğu yerleşik nesneyi kullanarak kolayca Javascript'e veya tersine dönüştürülebilir . Örneğin:

const Object = {
  property1: true,
  property2: false,
}; // creating object with JS object literal syntax

const JSON_object = JSON.stringify(Object);  // stringify JS object to a JSON string

console.log(JSON_object); // note that the (string) keys are in double quotes

const JS_object = JSON.parse(JSON_object);  // parse JSON string to JS object

console.log(JS_object.property1, JS_object.property2); 
// accessing keys of the newly created object


0

İşte şaşırtıcı bir fark: undefinedjson'da kullanamazsınız ve tanımlanmamış değerlere sahip tüm nesne alanları sonra kaybolurJSON.stringify

let object =  { "a": undefined } ;

let badJSON= '{ "a": undefined }';


console.log('valid JS object :', object );
console.log('JSON from object:', JSON.stringify(object) );
console.log('invalid json    :', JSON.parse(badJSON) );

🙈🙉🙊

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.