2010-03-12 7 views
5

Ich habe eine Zeichenfolge st von einem Webdienst zurückgegeben. Ich konvertiere die Zeichenfolge in ein Objekt, wie kann ich die Nummer zählen. von Arrays in ihm? (Für diesen Fall ist es)jSon Objekte zählen

var st = "{[{"Name": "fake", "Address": "add"]},[{"Name": "fake", "Address": "add"}]}"; 
var json = eval(st); 

json.length immer zurückkehrt

Antwort

17

@ coure06 Ich habe ein bisschen Ihren JSON geändert. Ich hoffe, dieser wird

var persons = { 
    "person1" : { 
     "Name": "Adam", 
     "Address": "USA" 
    }, 
    "person2" : { 
     "Name": "Jamie", 
     "Address": "USA" 
    } 
}; 
var count = 0; 
//var count = persons.length;   // wont work 
for (property in persons)   // should return 2 
{ 
    if(persons.hasOwnProperty(property)) 
    { 
     count++; 
    } 
} 

Live example at jsfiddle

+1

hasOwnProperty verwenden sollte: 'for (var x in Personen) if (persons.hasOwnProperty (x)) zählen ++; ' – vsync

-1
  1. Das ist nicht ein gültiger JSON Ausdruck ist.
  2. Es gibt keine integrierte Möglichkeit, "Mitglieder" eines Objekts zu zählen. Sie können eine schreiben, aber es ist problematisch aufgrund der matschigen Natur der Sprache.

bearbeiten — jetzt, dass ich es in die Zukunft gemacht habe, ist es möglich, APIs wie Object.keys() zu verwenden, Object.getOwnPropertyNames() und Object.getOwnPropertySymbols eine Anzahl von Eigenschaften in einem Objekt zu erhalten:

var props = Object.getOwnPropertySymbols(someObject); 
var length = props.length; // number of properties 

Meiner Erfahrung nach ist es ziemlich selten, dass mir die Anzahl der Eigenschaften in einem Objekt wichtig ist. Wenn Sie nicht wissen, was ein Objekt bereits ist, interessieren Sie sich normalerweise für bestimmte Eigenschaften (namentlich). Es ist jedoch nichts falsch daran, diese APIs zu verwenden.

5

Ich bin überrascht, json.length gibt alles zurück; Diese JSON-Zeichenfolge ist ungültig. Die äußersten geschweiften Klammern ({}) bezeichnen ein Objekt, das Schlüssel und Werte enthalten muss, aber es enthält nur einen Wert (das Array ohne Schlüssel).

Wenn Sie die geschweiften Klammern entfernen, sollte es ordnungsgemäß funktionieren. Hast du sie dort hingebracht, vielleicht weil du es gesehen hast? Wenn dies der Fall ist, möchten Sie Klammern (()), keine geschweiften Klammern.

Beachten Sie, dass eval auf JSON Strings nicht sicher ist, möchten Sie einen JSON-Decoder verwenden, die nicht eval (wie json2.js nicht verwendet, die eval verwendet, aber erst nach sehr sorgfältig sicher es ist gewährleistet, dies zu tun, es zu ändern wenn nötig), für optimale Sicherheit. Die Klammern helfen, aber sie sind keine vollständige Lösung.

2

Hier ist der Trick sehr nützlich sein!

var jsonString = "{field1:'data1',field2:'data2',arrField1:['arrField1Content1','arrField1Content2']}"; 
var obj = eval('(' + jsonString + ')'); 

var objCount=0; 
for(_obj in obj) objCount++; 

alert(objCount); 
1

Versuchen Sie es mit diesem

var persons = { 
    "person1" : { 
     "Name": "Adam", 
     "Address": "USA" 
    }, 
    "person2" : { 
     "Name": "Jamie", 
     "Address": "USA" 
    } 
}; 

Object.prototype.count = function() { 
    var that = this, 
     count = 0; 

    for(property in that) { 
     if(that.hasOwnProperty(property)) { 
      count++; 
     } 
    } 

    return count; 
}; 

alert(persons.count()); 

dies für verschachtelte Objekte funktionieren könnte wie

var persons = { 
    "person1" : { 
     "Name": "Adam", 
     "Address": "USA" 
    }, 
    "person2" : { 
     "Name": "Jamie", 
     "Address": "USA" , 
     "users": { 
      "person1" : { 
       "Name": "Adam", 
       "Address": "USA" 
      }, 
      "person2" : { 
       "Name": "Jamie", 
       "Address": "USA" 
      } 
     } 
    } 
}; 

alert(persons.person2.users.count()); 
+0

Elegant, gut gemacht! –

+0

Erweitern Objekt ist nicht die beste Idee http://StackOverflow.com/a/6877100/179669 – Bakudan