2011-10-03 4 views
2

J'ai quelques JSON qui ressemble à ceci:Convertir JSON tableau vide à chaîne vide

{ 
       "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": {} 
      } 

J'ai aussi cette boucle jQuery pour filtrer les valeurs:

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

Le problème est que sur les articles C3, P3, P4 & CN dans mon exemple, la boucle de chaque pousse la valeur [object Object] dans ma collection de valeur.

Existe-t-il un moyen de rendre ces éléments des chaînes vides plutôt que des objets?

+1

en fait, ce n'est pas ' JSON array' vide mais 'objet JSON vide', la différence est entre parenthèses' [] '(array),' {} '(objec t) –

+0

Dans JSON, un tableau est représenté par '[" value0 "," value1 "]' et un objet par '{" key0 ":" value0 "," key1 ":" value1 "}' http: // www .json.org/ –

Répondre

1

Vous pouvez utiliser:

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

La méthode stringify de l'objet JSON tourne un objet dans une chaîne. L'objet vide {} deviendra "{}". Si vous souhaitez ajouter une chaîne vide à la place, utilisez:

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

Si vous êtes 100% sûr que votre objet est vide, vous ne devez pas utiliser JSON.stringify. typeof innerValue == "onject" serait alors suffisant, pour vérifier si vous devez ajouter "" au lieu de innerValue.

Une autre méthode pour vérifier si un objet est vide ou non:

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

Est-ce que cela fonctionnera aussi? 'if (! InnerValue) {innerArr.push (innerValue); } ' – alykhalid

+0

Un objet sera toujours évalué à true. Les chaînes non vides et les entiers! = 0 seront également évalués à true. En résumé, votre proposition ne fonctionnera pas. –

+0

Merci pour votre précisions. – alykhalid

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

Pour votre information, vous pouvez utiliser la fonction .parseJSON et obtenir des résultats facilement

var obj = jQuery.parseJSON('{"ST":"Security"}'); 
alert(obj.ST === "Security"); 
0

Qu'est-ce la boucle intérieure pour? Il boucle sur chaque lettre des valeurs String.

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

Quoi qu'il en soit, vous pouvez utiliser jQuery.isEmptyObject() pour tester facilement si la valeur est un objet vide et la modifier à une chaîne vide.

0
$.each(data, function(key, value) { 
    var innerArr = []; 
    $.each(value, function(innerKey, innerValue) { 
     innerArr.push(innerValue); 
    }); 
    //valueArr.push(innerArr); 
    valueArr.push(innerArr.join()); 
}); 
1
$.each(data, function(key, value) { 
    var innerArr = []; 
    $.each(value, function(innerKey, innerValue) { 
     innerValue = ($.isEmptyObject(innerValue)) ? '' : innerValue; 
     innerArr.push(innerValue); 
    }); 
    valueArr.push(innerArr); 
}); 

Edit:

Si vous ne voulez pas compter sur la fonction de jQuery isEmptyObject(), vous pourriez implement one yourself:

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);