2012-01-06 28 views
47

Mới bắt đầu đào sâu vào JSON và tôi hiện đang cố gắng sử dụng một số làm "số nhận dạng", số này không hoạt động tốt. foo:"bar" hoạt động tốt, trong khi 0:"bar" thì không.Sử dụng số làm "chỉ mục" (JSON)

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

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

Có cách nào để thực hiện theo cách sau không? Một cái gì đó giống như Game.status[0].0 Sẽ làm cho cuộc sống của tôi trở nên dễ dàng hơn. Tất nhiên có những cách khác xung quanh nó, nhưng cách này được ưa thích hơn.

+1

Lý do cho điều này là trong JavaScript, như nhiều ngôn ngữ khác, tên của biến/thuộc tính không thể bắt đầu bằng một số, nhưng chỉ với $, _, a-z và A-Z. Tại sao không phải là 'Game.status [0]' một mảng? Sau đó cú pháp của bạn sẽ là 'Game.status [0] [0]'. –

Trả lời

73

JSON chỉ cho phép tên khóa là chuỗi. Các chuỗi đó có thể bao gồm các giá trị số.

Bạn hiện không sử dụng JSON. Bạn có một đối tượng JavaScript theo nghĩa đen. Bạn có thể sử dụng số nhận dạng cho khóa, nhưng số nhận dạng không thể bắt đầu bằng số. Bạn vẫn có thể sử dụng chuỗi mặc dù.

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

Nếu bạn truy cập thuộc tính có dấu chấm thì bạn phải sử dụng số nhận dạng. Sử dụng ký hiệu ngoặc vuông thay vì: Game[0][0].

Nhưng với dữ liệu đó, một mảng có vẻ hợp lý hơn.

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

Điều này sẽ không cho phép bạn thực hiện 'Game.status [0] .0' – JaredMcAteer

+8

Không, nhưng sẽ cho phép' Game.status [0] [0] '. – Amadan

+3

@OriginalSyn không thể có ´Game.status [0] .0´ vì Javascript chỉ cho phép tên thuộc tính bắt đầu bằng chữ cái hoặc dấu gạch dưới nếu bạn muốn sử dụng ký hiệu chấm. Không có cách nào xung quanh đó. – zatatatata

0

gì về

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

Liệu một trong những công việc?

PS: Những gì bạn có trong câu hỏi của mình là đối tượng Javascript chứ không phải JSON. JSON là phiên bản 'chuỗi' của đối tượng Javascript.

+0

"JSON là phiên bản 'chuỗi' của đối tượng Javascript." Điều đó không đúng. Một đối tượng JSON là một tập hợp con của một đối tượng JavaScript.Nếu không, bạn đúng là một đối tượng JavaScript vì nó không tuân theo JSON JSON – JaredMcAteer

+0

JSON là một tập con của ký hiệu chữ * đối tượng JavaScript * và một đối tượng JSON là một kiểu dữ liệu có thể được biểu diễn bằng JSON. – Quentin

+0

@OriginalSyn: Vâng, không thực sự. JSON là một định dạng "hoán đổi cho nhau" và được sử dụng như một định dạng chuỗi độc lập về ngôn ngữ. Hầu hết các ngôn ngữ có thể phân tích cú pháp JSON, và trong Javascript, nó sẽ biến thành một đối tượng Javascript. Xem http://benalman.com/news/2010/03/theres-no-such-thing-as-a-json/. –

4

Có thể bạn cần một mảng?

var Game = { 

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

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

Trước hết, không phải JSON: JSON ủy quyền rằng tất cả các khóa phải là chuỗi.

Thứ hai, mảng thường xuyên làm những gì bạn muốn:

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

sẽ làm việc, nếu bạn sử dụng Game.status[0][0]. Bạn không thể sử dụng các số có ký hiệu chấm (.0).

Hoặc, bạn có thể báo giá các số (ví dụ: { "0": "val" }...); bạn sẽ có các đối tượng thuần thay vì mảng, nhưng cú pháp tương tự sẽ hoạt động.

3

Khi tên của một đối tượng sở hữu của javascript không bắt đầu bằng một trong hai dấu gạch dưới hoặc một lá thư, bạn không thể sử dụng các ký hiệu dấu chấm (như Game.status[0].0), và bạn phải sử dụng các ký hiệu thay thế, đó là Game.status[0][0].

Một lưu ý khác, bạn có thực sự cần nó làm đối tượng bên trong mảng trạng thái không? Nếu bạn đang sử dụng đối tượng như một mảng, tại sao không sử dụng một mảng thực thay thế?

Các vấn đề liên quan