Преобразовать пустой массив JSON в пустую строку - PullRequest
2 голосов
/ 03 октября 2011

У меня есть некоторый JSON, который выглядит следующим образом:

{
                "ST": "Security",
                "C1": "Login failures",
                "C2": "1",
                "C3": {},
                "P1": "2",
                "P2": "administrator",
                "P3": {},
                "P4": {},
                "DESCR": "failed login attempts",
                "SID": "88",
                "AV": "NO",
                "SC": "0",
                "CN": {}
            }

У меня также есть этот цикл jQuery для фильтрации значений:

$.each(data, function(key, value) {
    var innerArr = [];
    $.each(value, function(innerKey, innerValue) {
        innerArr.push(innerValue);
    });
    valueArr.push(innerArr);
});

Проблема в том, что на элементах C3, P3, P4 & CN в моем примере, каждый цикл помещает значение [object Object] в мою коллекцию значений.

Есть ли способ сделать эти элементы пустыми строками, а не объектами?

Ответы [ 6 ]

1 голос
/ 03 октября 2011
$.each(data, function(key, value) {
    var innerArr = [];
    $.each(value, function(innerKey, innerValue) {
        innerValue = ($.isEmptyObject(innerValue)) ? '' : innerValue;
        innerArr.push(innerValue);
    });
    valueArr.push(innerArr);
});

Редактировать:

Если вы не хотите полагаться на функцию jQuery isEmptyObject(), вы можете реализовать ее самостоятельно :

Object.size = function(obj) {
    var size = 0, key;
    for (key in obj) {
        if (obj.hasOwnProperty(key)) size++;
    }
    return size;
};

// Get the size of an object
var size = Object.size(myArray);
1 голос
/ 03 октября 2011

К вашему сведению, вы можете использовать функцию .parseJSON и легко получать результаты

var obj = jQuery.parseJSON('{"ST":"Security"}');
alert( obj.ST === "Security" );
1 голос
/ 03 октября 2011
$.each(data, function(key, value) {
    var innerArr = [];
    $.each(value, function(innerKey, innerValue) {
        if (typeof innerValue == 'object') {
            innerValue = '';
        }
        innerArr.push(innerValue);
    });
    valueArr.push(innerArr);
});
1 голос
/ 03 октября 2011

Вы можете использовать:

...
if(typeof innerValue == "object") innerValue = JSON.stringify(innerValue);
valueArr.push(innerValue);
....

Метод stringify объекта JSON превращает объект в строку. Пустой объект {} превратится в "{}". Если вы хотите добавить пустую строку, используйте:

if(typeof innerValue == "object"){
    innerValue = JSON.stringify(innerValue);
    if(innerValue == "{}") innerValue = "";
}
valueArr.push(innerValue);

Если вы на 100% уверены, что ваш объект пуст, вам не нужно использовать JSON.stringify. typeof innerValue == "onject" тогда будет достаточно, чтобы проверить, нужно ли добавлять "" вместо innerValue.

Альтернативный метод проверки, является ли объект пустым или нет:

if(typeof innerValue == "object"){
    var isEmpty = true;
    for(var i in innerValue){
        isEmpty = false;
        break;
    }
    if(isEmpty) innerValue = "";
    else {
        //Object not empty, consider JSON.stringify
    }
}
valueArr.push(innerValue);
0 голосов
/ 03 октября 2011
$.each(data, function(key, value) {
    var innerArr = [];
    $.each(value, function(innerKey, innerValue) {
        innerArr.push(innerValue);
    });
    //valueArr.push(innerArr);
    valueArr.push(innerArr.join());
});
0 голосов
/ 03 октября 2011

Для чего нужен внутренний цикл?Он зацикливается на каждой букве строковых значений.

$.each(data, function(key, value) {
    var innerArr = [];
    if (jQuery.isEmptyObject(value)) {
        value = '';
    }
    ...
});

В любом случае вы можете использовать jQuery.isEmptyObject (), чтобы легко проверить, является ли значение пустым объектом и изменить его на пустойстрока.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...