Ich habe ein verschachteltes JSON-Objekt, das ich durchlaufen muss, und der Wert jedes Schlüssels kann ein String, ein JSON-Array oder ein anderes JSON-Objekt sein. Je nach Objekttyp muss ich verschiedene Operationen ausführen. Kann ich den Typ des Objekts auf irgendeine Weise überprüfen, um festzustellen, ob es sich um einen String, ein JSON-Objekt oder ein JSON-Array handelt?
Ich habe versucht, typeof
und instanceof
beide schienen nicht zu funktionieren, da typeof
ein Objekt sowohl für das JSON-Objekt als auch für das Array zurückgegeben wird und dabei instanceof
ein Fehler auftritt obj instanceof JSON
.
Genauer gesagt, kann ich nach dem Parsen des JSON in ein JS-Objekt auf irgendeine Weise überprüfen, ob es sich um eine normale Zeichenfolge oder ein Objekt mit Schlüsseln und Werten (von einem JSON-Objekt) oder ein Array (von einem JSON-Array) handelt )?
Beispielsweise:
JSON
var data = "{'hi':
{'hello':
['hi1','hi2']
},
'hey':'words'
}";
Beispiel JavaScript
var jsonObj = JSON.parse(data);
var path = ["hi","hello"];
function check(jsonObj, path) {
var parent = jsonObj;
for (var i = 0; i < path.length-1; i++) {
var key = path[i];
if (parent != undefined) {
parent = parent[key];
}
}
if (parent != undefined) {
var endLength = path.length - 1;
var child = parent[path[endLength]];
//if child is a string, add some text
//if child is an object, edit the key/value
//if child is an array, add a new element
//if child does not exist, add a new key/value
}
}
Wie führe ich die Objektprüfung wie oben gezeigt durch?
quelle
.parse()
eine JSON-Zeichenfolge erstellt haben, und wie man sie identifiziert.Antworten:
Ich würde das Konstruktorattribut überprüfen.
z.B
Bearbeiten: Es wurde eine Nullprüfung und eine undefinierte Prüfung hinzugefügt.
quelle
else if
ist unnötig{}.constructor
bewirkt, dass ichERROR TypeError: Cannot read property 'constructor' of undefined
in meine eckige Anwendung komme .Sie können Array.isArray verwenden , um nach Arrays zu suchen . Dann typeof obj == 'string' und typeof obj == 'object' .
quelle
typeof null === 'object'
[{ "name":[ {"key": "any key" } ] }]
Dies ist auch gültig json, aber sein Rückgabearray durch Ihren Code. Überprüfen Sie diese - GeigeEin JSON-Objekt ist ein Objekt. Um zu überprüfen, ob ein Typ ein Objekttyp ist, bewerten Sie die Konstruktoreigenschaft.
Gleiches gilt für alle anderen Typen:
quelle
JSON.parse()
, wird die JSON-Ressource zu einem Objekt. Wenn Sie eine von einem Server stammende Ressource testen, um festzustellen, ob es sich um JSON handelt, sollten Sie daher zuerst nach String suchen, dann nach a not a<empty string>
und dann nach dem Parsen nach einem Objekt.Wenn Sie versuchen, den Typ eines zu überprüfen,
object
nachdem Sie einenJSON
String analysiert haben , empfehle ich, das Konstruktorattribut zu überprüfen:Dies ist eine viel schnellere Überprüfung als typeof oder instanceof.
Wenn eine JSON-Bibliothek keine mit diesen Funktionen erstellten Objekte zurückgibt, wäre ich sehr misstrauisch.
quelle
Die Antwort von @PeterWilkinson hat bei mir nicht funktioniert, da ein Konstruktor für ein "typisiertes" Objekt an den Namen dieses Objekts angepasst ist. Ich musste mit Typ arbeiten
quelle
Sie können Ihren eigenen Konstruktor für das JSON-Parsing erstellen:
Überprüfen Sie dann die Instanz von, um festzustellen, ob sie ursprünglich analysiert werden musste
quelle
Ich habe ein npm-Modul geschrieben, um dieses Problem zu lösen. Es ist hier verfügbar :
object-types
: Ein Modul zum Finden, welche Literaltypen Objekten zugrunde liegenInstallieren
Verwendung
Werfen Sie einen Blick darauf, es sollte Ihr genaues Problem lösen. Lassen Sie mich wissen, wenn Sie Fragen haben! https://github.com/dawsonbotsford/object-types
quelle
Sie können auch versuchen, die Daten zu analysieren und dann zu überprüfen, ob Sie ein Objekt erhalten haben:
quelle
Ich kombiniere den Operator typeof mit einer Überprüfung des Konstruktorattributs (von Peter):
Ergebnis:
quelle
Ich weiß, dass dies eine sehr alte Frage mit guten Antworten ist. Es scheint jedoch immer noch möglich zu sein, meine 2 ¢ hinzuzufügen.
Angenommen, Sie versuchen, nicht ein JSON-Objekt selbst zu testen, sondern einen String, der als JSON formatiert ist (was in Ihrem Fall der Fall zu sein scheint
var data
), könnten Sie die folgende Funktion verwenden, die einen Booleschen Wert zurückgibt (ist oder ist kein ' JSON '):Hier einige Beispiele für die Verwendung der obigen Funktion:
Wenn Sie den obigen Code ausführen, erhalten Sie die folgenden Ergebnisse:
Bitte probieren Sie das folgende Snippet aus und lassen Sie uns wissen, ob dies für Sie funktioniert. :) :)
WICHTIG: Die in diesem Beitrag vorgestellte Funktion wurde von https://airbrake.io/blog/javascript-error-handling/syntaxerror-json-parse-bad-parsing angepasst. Dort finden Sie weitere und interessante Details zu JSON.parse ( ) Funktion.
quelle
Versuche dies
Es funktioniert für das folgende Beispiel
quelle
Peters Antwort mit einem zusätzlichen Scheck! Natürlich nicht 100% garantiert!
quelle
Warum nicht Number überprüfen - etwas kürzer und funktioniert in IE / Chrome / FF / node.js.
quelle
versuche es auf diese schmutzige Weise
quelle