AJAX: Prüfen, ob eine Zeichenfolge JSON ist?

Lesezeit: 3 Minuten

Benutzer-Avatar
Nik Heiner

Mein JavaScript stürzt manchmal in dieser Zeile ab:

var json = eval('(' + this.responseText + ')');

Abstürze werden verursacht, wenn das Argument von eval() ist kein JSON. Gibt es eine Möglichkeit zu überprüfen, ob die Zeichenfolge JSON ist, bevor Sie diesen Aufruf tätigen?

Ich möchte kein Framework verwenden – gibt es eine Möglichkeit, dies mit nur eval()? (Es gibt einen guten Grund, versprochen.)

  • Sie könnten versuchen, JSON.parse() in einem try/catch … zu fangen, es ist kein gültiges JSON-Markup. Das ist natürlich irgendwie ineffizient, heh … Können Sie mir ein Beispiel für das ungültige JSON-Markup geben, das Sie erhalten?

    – Warzig

    22. Februar 2010 um 19:50 Uhr


  • Mögliches Duplikat von How to check if a string is a valid JSON string in JavaScript without using Try/Catch

    – Donald Duck

    21. Juni 2019 um 15:47 Uhr

Benutzer-Avatar
Brettkelly

Wenn Sie die einbeziehen JSON-Parser von json.org können Sie die Funktion parse() verwenden und sie einfach in einen try/catch einschließen, etwa so:

try
{
   var json = JSON.parse(this.responseText);
}
catch(e)
{
   alert('invalid json');
}

So etwas würde wahrscheinlich das tun, was Sie wollen.

  • Mit jQuery.parseJSON(..) müssten Sie json.org nicht einschließen

    – RayLoveless

    27. Dezember 2012 um 5:57 Uhr

  • @Raymo OP hat nicht erwähnt, dass jQuery und json2.js weniger als die Hälfte der Größe von jQuery (in Bezug auf die Dateigröße) verwenden.

    – brettkelly

    27. Dezember 2012 um 17:27 Uhr

  • Das Analysieren einer ganzen Zeichenfolge ist eine schlechte Vorgehensweise, und das Auslösen einer Ausnahme kann zu Verzögerungen führen

    – duftend

    29. Juni 2016 um 23:20 Uhr

  • Es wird keine Ausnahme ausgelöst, wenn Sie eine Zahlenfolge senden

    – Hescham Jassin

    30. Juli 2018 um 11:20 Uhr

Hers ist die jQuery-Alternative …

try
{
  var jsonObject = jQuery.parseJSON(yourJsonString);
}
catch(e)
{
  // handle error 
}

Ich empfehle Ihnen dringend, a Javascript-JSON-Bibliothek zum Serialisieren von und nach JSON. eval() ist ein Sicherheitsrisiko, das niemals verwendet werden sollte, es sei denn, Sie sind es absolut sicher dass seine Eingabe bereinigt und sicher ist.

Wenn eine JSON-Bibliothek vorhanden ist, packen Sie den Aufruf einfach in seine parse() Äquivalent in einem try/catch-Block zur Verarbeitung von Nicht-JSON-Eingaben:

try
{
  var jsonObject = JSON.parse(yourJsonString);
}
catch(e)
{
  // handle error 
}

Benutzer-Avatar
Dujardin Emmanuel

Vielleicht hilft das: Mit diesem Code kommen Sie direkt an Ihre Daten…

<!DOCTYPE html>
<html>
<body>

<h3>Open console, please, to view result!</h3>
<p id="demo"></p>

<script>
var tryJSON = function (test) {
	try {
	    JSON.parse(test);
	}
	catch(err) {
    	// maybe you need to escape this… (or not)
	    test="""+test.replace(/\\?"/g,'\\"')+'"';
	}
	eval('test="+test);
	console.debug("Try json:', test);
};

// test with string…
var test="bonjour "mister"";
tryJSON(test);
// test with JSON…
var test="{"fr-FR": "<p>Ceci est un texte en français !</p>","en-GB": "<p>And here, a text in english!</p>","nl-NL": "","es-ES": ""}";
tryJSON(test);
</script>

</body>
</html>

Das Problem mit je nach try-catch Ansatz ist das JSON.parse('123') = 123 und es wird keine Ausnahme ausgelöst. Daher zusätzlich zu den try-catchmüssen wir den Typ wie folgt überprüfen:

function isJsonStr(str) {
    var parsedStr = str;
    try {
        parsedStr = JSON.parse(str);
    } catch (e) {
        return false;
    }
    return typeof parsedStr == 'object'
}

Benutzer-Avatar
ZUGEBEN

Warum können Sie nicht einfach überprüfen, was die Antwort ist? Es ist effizienter.

var result;

if (response.headers['Content-Type'] === 'application/json')
    result = JSON.parse(this.responseText);
else
    result = this.responseText;

Bildschirm1

Benutzer-Avatar
remy

jQuery $.ajax() werde die hinzufügen responseJSON -Eigenschaft auf das Antwortobjekt, und um zu testen, ob die Antwort JSON ist, können Sie Folgendes verwenden:

if (xhr.hasOwnProperty('responseJSON')) {}

1144790cookie-checkAJAX: Prüfen, ob eine Zeichenfolge JSON ist?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy