Мне здесь что-то не хватает, но следующий код (Fiddle) возвращает пустую строку:
var test = new Array();
test['a'] = 'test';
test['b'] = 'test b';
var json = JSON.stringify(test);
alert(json);
Каков правильный способ JSON'a этого массива?
Мне здесь что-то не хватает, но следующий код (Fiddle) возвращает пустую строку:
var test = new Array();
test['a'] = 'test';
test['b'] = 'test b';
var json = JSON.stringify(test);
alert(json);
Каков правильный способ JSON'a этого массива?
Обычные массивы JavaScript предназначены для хранения данных с числовыми индексами. Вы можете набить им имена ключей (и это может быть полезно, когда вы хотите хранить метаданные о массиве, который содержит нормальные, упорядоченные, индексированные по цифре данные), но это не то, для чего они предназначены. Тип данных массива JSON не может иметь именованные ключи в массиве.
Если вам нужны именованные ключи, используйте объект, а не массив.
var test = {}; // Object
test['a'] = 'test';
test['b'] = []; // Array
test['b'].push('item');
test['b'].push('item2');
test['b'].push('item3');
var json = JSON.stringify(test);
alert(json);
Хорошее объяснение и пример выше. Я нашел это (JSON.stringify() массив bizarreness с Prototype.js), чтобы завершить ответ. Некоторые сайты реализуют свой собственный JSON с помощью JSONFilters, поэтому удалите его.
if(window.Prototype) {
delete Object.prototype.toJSON;
delete Array.prototype.toJSON;
delete Hash.prototype.toJSON;
delete String.prototype.toJSON;
}
он отлично работает и выход теста:
console.log(json);
Результат:
"{"a":"test","b":["item","item2","item3"]}"
Я разместил исправление для этого здесь
Вы можете использовать эту функцию для изменения JSON.stringify
для кодирования arrays
, просто разместите ее рядом с началом вашего script (подробнее см. ссылку выше):
// Upgrade for JSON.stringify, updated to allow arrays
(function(){
// Convert array to object
var convArrToObj = function(array){
var thisEleObj = new Object();
if(typeof array == "object"){
for(var i in array){
var thisEle = convArrToObj(array[i]);
thisEleObj[i] = thisEle;
}
}else {
thisEleObj = array;
}
return thisEleObj;
};
var oldJSONStringify = JSON.stringify;
JSON.stringify = function(input){
if(oldJSONStringify(input) == '[]')
return oldJSONStringify(convArrToObj(input));
else
return oldJSONStringify(input);
};
})();
В качестве альтернативы вы можете использовать это как
var test = new Array();
test[0]={};
test[0]['a'] = 'test';
test[1]={};
test[1]['b'] = 'test b';
var json = JSON.stringify(test);
alert(json);
Подобно этому вы JSON-ing массива.
Json должен иметь пары ключ-значение. У вас все еще может быть массив как часть ценности. Таким образом добавьте "ключ" вашего chousing:
var json = JSON.stringify({whatver: test});