webentwicklung-frage-antwort-db.com.de

AJAX: Prüfen Sie, ob eine Zeichenfolge JSON ist.

Mein JavaScript stürzt manchmal in dieser Zeile ab:

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

Abstürze werden verursacht, wenn das Argument von eval() nicht JSON ist. Gibt es eine Möglichkeit, vor dem Aufruf zu überprüfen, ob der String JSON ist?

Ich möchte kein Framework verwenden - gibt es eine Möglichkeit, diese Funktion nur mit eval() zu nutzen? (Es gibt einen guten Grund, ich verspreche es.)

77
Nick Heiner

Wenn Sie den JSON-Parser von json.org einschließen, können Sie dessen parse () - Funktion verwenden und diese einfach in einen try/catch einfassen, wie folgt:

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

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

147
inkedmn

Ihr ist die jQuery-Alternative ...

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

Ich empfehle dringend, eine Javascript-JSON-Bibliothek für die Serialisierung von und nach JSON zu verwenden. eval() ist ein Sicherheitsrisiko, das niemals angewendet werden sollte, es sei denn, Sie sind absolut sicher , dass die Eingabe bereinigt und sicher ist.

Wenn eine JSON-Bibliothek vorhanden ist, verpacken Sie den Aufruf einfach in einem try/catch-Block in das entsprechende parse() -Element, um Nicht-JSON-Eingaben zu verarbeiten:

try
{
  var jsonObject = JSON.parse(yourJsonString);
}
catch(e)
{
  // handle error 
}
14
Håvard S

Promise statt Try-catch:

npm install is-json-promise ; //for NodeJS environment.

ODER 

String.IsJSON = (candidate) => 
   new Promise(
     (resolve, reject) => resolve(JSON.parse(candidate))
    ) 
;

Anwendungsfälle :

String.IsJSON(`iam here`)
   .then((object) => console.info(object))
   .catch((error) => alert('Waww, i cannot be JSON')) ; // promise will run catch

oder 

String.IsJSON(`{"welcome":"Hello"}`)
   .then((object) => console.info(object)) // promise will run "then"
   .catch((error) => alert('Waww, i cannot be JSON')) ; 
7
Abdennour TOUMI

Vielleicht hilft das: Mit diesem Code können Sie Ihre Daten direkt abrufen…

<!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>

0

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

var result;

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

screen1

0
ADM-IT

Nachfolgend finden Sie eine Funktion, die Sie ausprobieren können:

String.prototype.isJson = function () {
  try {
      JSON.parse(this.toString());
      return true;
  } catch (ex) {
      return false;
  }
};
0
Musa Kurt

Das Problem mit dem try-catch-Ansatz ist, dass JSON.parse('123') = 123 keine Ausnahme auslöst. Daher müssen wir den Typ zusätzlich zum try-catch wie folgt überprüfen:

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

Es gibt eine kleine Bibliothek, die die JavaScript-Typen überprüft: is.js

is.json({foo: 'bar'});
=> true

// functions are returning as false
is.json(toString);
=> false

is.not.json([]);
=> true

is.all.json({}, 1);
=> false

is.any.json({}, 2);
=> true

// 'all' and 'any' interfaces can also take array parameter
is.all.json([{}, {foo: 'bar'}]);
=> true

Eigentlich ist is.js viel mehr als das, einige lobende Erwähnungen:

var obj = document.createElement('div');
is.domNode(obj);
=> true

is.error(new Error());
=> true

is.function(toString);
=> true

is.chrome();
=> true if current browser is chrome


0
Ramazan Polat