Подтвердить что ты не робот

JSON.stringify не работает с обычным массивом Javascript

Мне здесь что-то не хватает, но следующий код (Fiddle) возвращает пустую строку:

var test = new Array();
test['a'] = 'test';
test['b'] = 'test b';
var json = JSON.stringify(test);
alert(json);

Каков правильный способ JSON'a этого массива?

4b9b3361

Ответ 1

Обычные массивы 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);

Ответ 2

Хорошее объяснение и пример выше. Я нашел это (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"]}"

Ответ 3

Я разместил исправление для этого здесь

Вы можете использовать эту функцию для изменения 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);
    };
})();

Ответ 4

В качестве альтернативы вы можете использовать это как

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 массива.

Ответ 5

Json должен иметь пары ключ-значение. У вас все еще может быть массив как часть ценности. Таким образом добавьте "ключ" вашего chousing:

var json = JSON.stringify({whatver: test});