2012-01-23 37 views
5

Xin lỗi vì câu hỏi cuối cùng của tôi là rất khó hiểu, tôi đã nhầm lẫn tự ngã của tôi, nhưng bây giờ tôi có một ví dụ thích hợp:JSON.stringify (object) không chính xác

var obj = {}; 
obj.entities = []; 
obj.entities["player"] = []; 
obj.entities["player"]["0"] = []; 
obj.entities["player"]["0"]["pos"] = "0,0"; 

var jsonStr = JSON.stringify(jsonObj); 

// {"entities":[]} 
console.log(JSON.stringify(obj)); 

Kết quả của JSON.stringify(obj) là sai như bạn có thể nhìn thấy . Điều gì gây ra điều này?

+0

+1 Cải thiện nhiều! ;) –

Trả lời

12

Bạn đang đầu tiên xây dựng một mảng ([]), sau đó gán thuộc tính cho nó với các phím không số (player). Đây là kỹ thuật có thể (như trong không gây ra một lỗi), nhưng nó không phải là những gì mảng cho.

Thay vào đó, bạn nên sử dụng đối tượng ({}). Ngoài ra, ["player"] cũng giống như .player.

var obj = {}; 
obj.entities = {}; 
obj.entities.player = []; // array here because you're filling with indices ([0]) 
obj.entities.player[0] = {}; // object again, because non-indices as keys (`pos`) 
obj.entities.player[0].pos = "0,0"; 

Đối tượng có thể lấy bất kỳ khóa thuộc tính nào. Mảng là một tập hợp các đối tượng, chỉ có các chỉ mục (số >= 0) làm khóa.

+0

Ah, cảm ơn vì lời giải thích, tôi đã không hoàn toàn nhận thức được sự khác biệt mảng đối tượng. Nhưng tôi vẫn có thể làm 'obj.entities.player = {};' và sau đó là 'obj.entities.player.pos =" 0,0 ";' có thể không? –

+0

@ elias94xx: Nếu bạn có một người chơi, thì điều đó là có thể. Mặc dù '[" 0 "]' bạn đã viết làm cho tôi cho rằng bạn có một danh sách (mảng) của người chơi bằng cách nào đó. – pimvdb

+0

Vâng xin lỗi, tôi quên mất id trong một giây. :) –

1

Bạn đang sử dụng phân đoạn mảng có tên thay vì cặp khóa/giá trị đối tượng.

var obj = {}; 
obj.entities = {}; 
obj.entities["player"] = {}; 
obj.entities["player"]["0"] = []; 
obj.entities["player"]["pos"] = "0,0"; 

// {"entities":{"player":{"0":[],"pos":"0,0"}}} 
console.log(JSON.stringify(obj)); 
1

entities, và entities["player"]entities["player"]["0"] cần phải đối tượng, không mảng.

Bạn đang thêm thuộc tính vào các mảng này, thay vì đẩy giá trị lên chúng. Các thuộc tính tùy chỉnh này không bị xâu chuỗi.

Việc sửa chữa rất đơn giản:

var obj = {}; 
obj.entities = {}; // <------------ this is an object now 
obj.entities["player"] = {}; // <--------- also an object 
obj.entities["player"]["0"] = {}; // <-------- and so on 
obj.entities["player"]["0"]["pos"] = "0,0"; 
3

Cuộc sống của bạn sẽ dễ dàng hơn nhiều nếu bạn muốn xác định đối tượng của bạn trong JSON để bắt đầu với:

var obj = { 
    'entities': [ 
    {'player':{'pos': '0,0'}} 
    ] 
}; 
1

Tôi nghĩ rằng bạn có một số nhầm lẫn nghiêm trọng về mảng và các đối tượng trong javascript. Một mảng ([]) chỉ hoạt động với các chỉ số nguyên dương. Trong ví dụ của bạn, bạn đang làm như sau:

obj.entities = []; 
obj.entities["player"] = []; 

Bạn nói rằng obj.entities là một mảng và sau đó bạn sử dụng player như chỉ mục. Và player không phải là số nguyên. Vì vậy, mã này không có ý nghĩa. Mặt khác, bạn có thể sử dụng các đối tượng với các thuộc tính. Các thuộc tính đó có thể là chuỗi:

obj.entities = {}; 
obj.entities.player = []; 
obj.entities.player[0] = 'foo bar'; 
1

Bạn đang gây nhầm lẫn với các đối tượng có mảng. Mã sau đây sẽ hoạt động.

var obj = {}; 
obj.entities = {}; 
obj.entities.player = []; 
obj.entities.player[0] = {}; 
obj.entities.player[0].pos = "0,0"; 

Những điều bạn đã đi sai:

  1. Một mảng có thể chỉ có chỉ số số nguyên. Do đó, viết sai [1 ​​1]] nếu bạn định sử dụng a làm mảng.
  2. Để được sắp xếp chính xác, chỉ một đối tượng có thể có các thuộc tính được đặt tên, như object.entities.player hoặc object.entities["player"].
+1

Lưu ý rằng các khóa luôn là chuỗi, vì vậy không có sự khác biệt giữa '[" 1 "]' hoặc '[1]'. Cái cuối cùng chỉ đơn thuần là ngữ nghĩa hơn. – pimvdb

+0

@pimvdb bạn hoàn toàn đúng – frm

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