Sayıyı "dizin" olarak kullanma (JSON)


89

Son zamanlarda JSON'da araştırma yapmaya başladım ve şu anda "tanımlayıcı" olarak bir sayı kullanmaya çalışıyorum, bu da pek iyi sonuç vermiyor. foo:"bar"iyi çalışıyor, ancak 0:"bar"çalışmıyor.

var Game = {
    status: [
                {
                    0:"val",
                    1:"val",
                    2:"val"
                },
                {
                    0:"val",
                    1:"val",
                    2:"val"
                }
           ]
}

alert(Game.status[0].0);

Bunu şu şekilde yapmanın bir yolu var mı? Game.status[0].0Hayatımı kolaylaştıracak gibi bir şey . Elbette etrafında başka yollar da var ama bu yol tercih ediliyor.


3
Bunun nedeni, diğer birçok dilde olduğu gibi JavaScript'te de bir özelliğin / değişken adının bir sayı ile başlayamayacağı, sadece $, _, az ve AZ ile başlayacağıdır. Neden Game.status[0]bir dizi değil ? O zaman söz diziminiz olacaktır Game.status[0][0].
nikc.org

Yanıtlar:


132

JSON, yalnızca anahtar adlarının dize olmasına izin verir. Bu dizeler sayısal değerlerden oluşabilir.

Yine de JSON kullanmıyorsunuz. Bir JavaScript nesneniz var. Sen edebilirsiniz anahtarlar için kimlikler kullanılır, ancak bir tanımlayıcı bir sayı ile başlayamaz. Yine de dizeleri kullanabilirsiniz.

var Game={
    "status": [
        {
            "0": "val",
            "1": "val",
            "2": "val"
        },
        {
            "0": "val",
            "1": "val",
            "2": "val"
        }
    ]
}

Özelliklere noktalı gösterimle erişirseniz, tanımlayıcıları kullanmanız gerekir. Yerine köşeli ayraç notasyonu kullanın: Game.status[0][0].

Ancak bu veriler göz önüne alındığında, bir dizi daha mantıklı görünebilir.

var Game={
    "status": [
        [
            "val",
            "val",
            "val"
        ],
        [
            "val",
            "val",
            "val"
        ]
    ]
}

Bu yine de yapmanıza izin vermezGame.status[0].0
JaredMcAteer

16
Hayır, ama izin verecek Game.status[0][0].
Amadan

4
@OriginalSyn, "Game.status [0] .0" 'a sahip olmak imkansızdır çünkü Javascript, nokta gösterimini kullanmak istiyorsanız, özellik adlarının yalnızca bir harf veya alt çizgiyle başlamasına izin verir. Bunun başka yolu yok.
zatatatata

1
Cevap için çok teşekkürler, tam olarak aradığım şey. Dürüst olmak gerekirse, neden başlamak için bir dizi düşünmediğime dair hiçbir fikrim yok - Beynin donmasını suçlayacağım.
Zar

@Quentin, JSON ile bir JS nesnesi arasındaki You aren't using JSON though. You have a JavaScript object literal. tek fark mı var =yoksa daha fazla fark var mı? JSON nesnesi temelde bir değişkende mi depolanıyor?
Andre Bulatov

7

Öncelikle, bu JSON değildir: JSON, tüm anahtarların dizge olması gerektiğini zorunlu kılar.

İkinci olarak, normal diziler istediğinizi yapar:

var Game = {
  status: [
    [
      "val",
      "val",
      "val"
    ],
    [
      "val",
      "val",
      "val"
    ]
  }

kullanırsanız çalışacak Game.status[0][0]. Nokta notasyonlu ( .0) sayıları kullanamazsınız .

Alternatif olarak, sayıları (yani { "0": "val" }...) alıntı yapabilirsiniz ; Diziler yerine düz nesnelere sahip olacaksınız, ancak aynı sözdizimi çalışacaktır.


5

Muhtemelen bir diziye ihtiyacınız var?

var Game = {

    status: [
        ["val", "val","val"],
        ["val", "val", "val"]
    ]
}

alert(Game.status[0][0]);

3

Bir JavaScript nesne tesisin adı bir alt çizgi veya bir harf ya ile başlamayan yaparken (gibi nokta gösterimini cant'kullanma Game.status[0].0) ve gereken ise alternatif notasyonu kullanmak Game.status[0][0].

Farklı bir not, bunun durum dizisi içinde bir nesne olmasına gerçekten ihtiyacınız var mı? Nesneyi bir dizi gibi kullanıyorsanız, bunun yerine neden gerçek bir dizi kullanmıyorsunuz?


2

JSON, anahtar türünü dize olacak şekilde düzenler. Amaç, nesnenin üyelerine erişmek için nokta gösterimini desteklemektir.

Örneğin, kişi = {"boy": 170, "kilo": 60, "yaş": 32}. Üyelere person.height, person.weight, vb. Göre erişebilirsiniz. JSON değer anahtarlarını destekliyorsa, o zaman kişi.0, kişi.1, kişi.2 gibi görünür.


1
Person.1, person.2 vb. İle ilgili sorunun ne olduğunu görmüyorum
Anshul

1

JSON, "JavaScript Nesne Gösterimi" dir. JavaScript, anahtarlarının dizeler veya semboller olması gerektiğini belirtir.

MDN Docs'tan alınan aşağıdaki alıntı, "anahtar / değer" olarak daha sık duyduğum terimleri ifade etmek için "anahtar / özellik" terimlerini kullanır.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Objects

JavaScript'te nesneler bir özellikler koleksiyonu olarak görülebilir. Nesne değişmez sözdizimi ile sınırlı bir özellik kümesi başlatılır; daha sonra özellikler eklenebilir ve kaldırılabilir. Özellik değerleri, diğer nesneler de dahil olmak üzere her türden değer olabilir ve bu, karmaşık veri yapılarının oluşturulmasını sağlar. Özellikler, anahtar değerleri kullanılarak tanımlanır. Anahtar değeri, Dize veya Sembol değeridir.


0

Ne dersin

Game.status[0][0] or Game.status[0]["0"] ?

Bunlardan biri çalışıyor mu?

Not: Sorunuzda ne var JSON değil, bir Javascript Nesnesi. JSON, bir Javascript Nesnesinin 'dizgi' sürümüdür.


"JSON, bir Javascript Nesnesinin 'dize' sürümüdür." Bu doğru değil. JSON nesnesi, bir JavaScript Nesnesinin alt kümesidir. Aksi takdirde, JSON spesifikasyonuna uymadığı için bunun bir JavaScript Nesnesi olduğu konusunda
haklısınız

JSON, JavaScript nesnesi değişmez gösteriminin bir alt kümesidir ve JSON nesnesi, JSON ile ifade edilebilen bir veri türüdür.
Quentin

@OriginalSyn: Aslında değil. JSON, "değiştirilebilir" bir biçimdir ve dilden bağımsız bir dize biçimi olarak kullanılır. Çoğu dil JSON'u ayrıştırabilir ve Javascript'te bir Javascript Nesnesine dönüşür. Benalman.com/news/2010/03/theres-no-such-thing-as-a-json adresine bakın .
Willem Mulder

1
@OriginalSyn: JavaScript'te, nesne değişmezleri asla JSON değildir, çünkü JSON her zaman bir dizedir. Nesne değişmezleri dizge değildir. "JSON nesnesi" terimi bir anlam ifade etmiyor, çünkü bir şey hem "JSON" - bir dize hem de bir "nesne" - bir dize dışı olamaz.
nnnnnn
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.