Ich habe einen einfachen AJAX-Aufruf und der Server gibt entweder eine JSON-Zeichenfolge mit nützlichen Daten oder eine von der PHP-Funktion erzeugte Fehlermeldung zurück mysql_error()
. Wie kann ich testen, ob diese Daten eine JSON-Zeichenfolge oder die Fehlermeldung sind?
Es wäre schön, eine Funktion zu verwenden, die aufgerufen wird, isJSON
genau wie Sie die Funktion verwenden können, um instanceof
zu testen, ob etwas ein Array ist.
Das ist was ich will:
if (isJSON(data)){
//do some data stuff
}else{
//report the error
alert(data);
}
javascript
mysql
json
jeffery_the_wind
quelle
quelle
eval()
wenn esundefined
dann zurückkehrt , ist es nicht JSONAntworten:
Verwenden Sie JSON.parse
quelle
JSON.parse(1234)
ODERJSON.parse(0)
ODERJSON.parse(false)
ODERJSON.parse(null)
alle werden keine Ausnahme auslösen und true zurückgeben !!. Verwenden Sie diese Antwort nicht1234
,0
,false
, undnull
sind alle gültigen JSON - Werte. Wenn Sie ein Prädikat möchten, das testet, ob der JSON ein Objekt darstellt, müssen Sie etwas mehr tun.JSON.parse
führt eine Menge Berechnungen durch, um die Zeichenfolge zu analysieren und Ihnen das json-Objekt zu geben, wenn dies erfolgreich ist. Sie verwerfen jedoch das Ergebnis, das einige Benutzer möglicherweise verwenden möchten. Das scheint nicht gut zu sein. Ich würde stattdessenreturn {value: JSON.parse(str), valid: true};
und im catch-Blockreturn {value: str, valid: false};
.. und ich würde den Funktionsnamen in änderntryParse()
.Dieser Code ist
JSON.parse(1234)
oderJSON.parse(0)
oderJSON.parse(false)
oderJSON.parse(null)
alle geben true zurück.Also habe ich den Code folgendermaßen umgeschrieben:
Testergebnis:
isJson Testergebnis
quelle
return (typeof suspect === "object" && suspect !== null);
Lassen Sie uns dies noch einmal zusammenfassen (für 2019+).
FAKT : Diese primitiven Werte sind JSON-analysierbar, aber keine wohlgeformten JSON-Strukturen . Die JSON- Spezifikation gibt an, dass JSON auf zwei Strukturen basiert: einer Sammlung von Name / Wert-Paaren (Objekt) oder einer geordneten Liste von Werten (Array).
Tatsache : Nein! Es ist definitiv legal, try / catch zu verwenden, insbesondere in einem solchen Fall. Andernfalls müssten Sie viele Zeichenfolgenanalysen durchführen, z. B. Tokenisierungs- / Regex-Operationen. das hätte schreckliche Leistung.
hasJsonStructure()
Dies ist nützlich, wenn Sie überprüfen möchten, ob einige Daten / Texte das richtige JSON-Austauschformat haben.
Verwendung:
safeJsonParse()
Dies ist nützlich, wenn Sie beim Parsen einiger Daten auf einen JavaScript-Wert vorsichtig sein möchten.
Verwendung:
quelle
Wenn der Server mit JSON antwortet, hat er einen
application/json
Inhaltstyp. Wenn er mit einer Nur-Text-Nachricht antwortet, sollte er einentext/plain
Inhaltstyp haben. Stellen Sie sicher, dass der Server mit dem richtigen Inhaltstyp antwortet, und testen Sie dies.quelle
overrideMimeType
kann der Inhaltstyp-Header überschrieben werden.Wenn
jQuery $.ajax()
die Antwort verwendet wird, hat sie dieresponseJSON
Eigenschaft, wenn die Antwort JSON war. Dies kann folgendermaßen überprüft werden:quelle
Ich mag die beste Antwort, aber wenn es eine leere Zeichenfolge ist, gibt sie true zurück. Also hier ist eine Lösung:
quelle
Ich werde Ihnen jedoch vorschlagen, dass Ihr http-Anruf / Dienst http immer Daten im gleichen Format zurückgibt. Wenn Sie also einen Fehler haben, sollten Sie ein JSON-Objekt haben, das diesen Fehler umschließt:
Und vielleicht verwenden Sie neben dem HTTP-Status auch einen 5xx-Code.
quelle
Nun ... Es hängt davon ab, wie Sie Ihre Daten erhalten. Ich denke, der Server antwortet mit einer JSON-formatierten Zeichenfolge (z. B. mit json_encode () in PHP). Wenn Sie JQuery post verwenden und die Antwortdaten auf ein JSON-Format festlegen und es sich um ein fehlerhaftes JSON handelt, wird ein Fehler ausgegeben:
Wenn Sie jedoch die Typantwort als Text verwenden, müssen Sie $ .parseJSON verwenden. Laut jquery site: "Das Übergeben einer fehlerhaften JSON-Zeichenfolge kann dazu führen, dass eine Ausnahme ausgelöst wird". Ihr Code lautet also:
quelle
response
leer, geht es zusuccess
: '(Es gibt wahrscheinlich Tests, die Sie durchführen können, zum Beispiel wenn Sie wissen, dass der zurückgegebene JSON immer von umgeben sein wird,
{
und}
dann könnten Sie nach diesen Zeichen oder einer anderen hackigen Methode testen. Oder Sie können die JS-Bibliothek von json.org verwenden, um zu versuchen, sie zu analysieren und zu testen, ob sie erfolgreich ist.Ich würde jedoch einen anderen Ansatz vorschlagen. Ihr PHP-Skript gibt derzeit JSON zurück, wenn der Aufruf erfolgreich ist, aber etwas anderes, wenn dies nicht der Fall ist. Warum nicht immer JSON zurückgeben?
Z.B
Erfolgreicher Anruf:
Fehlerhafter Anruf:
Dies würde das Schreiben Ihrer clientseitigen JS erheblich vereinfachen. Sie müssen lediglich das "Status" -Mitglied überprüfen und entsprechend handeln.
quelle
Ich benutze nur 2 Zeilen, um das auszuführen:
Das ist alles!
Beachten Sie jedoch, dass es zwei Traps gibt:
1.
JSON.parse(null)
Gibtnull
2. zurück . Jede Zahl oder Zeichenfolge kann mit der
JSON.parse()
Methode analysiert werden.JSON.parse("5")
gibt5
JSON.parse(5)
zurück gibt zurück5
Lassen Sie uns etwas mit Code spielen:
quelle
[
und angegeben werden muss]
. Zum Beispiel[1, 2, 3]
ist ein Zahlenarray.["a", "b", "c"]
ist ein String-Array. Und[{"a":1}, {"b":2}]
ist ein JSON-Array. Ihre jsfiddle-Arbeit scheint wirklich nützlich zu sein!JSON.parse
. Kann jemand raten, wie dieser Fehler vermieden werden kann, ohne try zu verwenden?jsfiddle
Anwendung gibt einen Fehler aus, da Test 3 keinen gültigen JSON-Ausdruck hat. Alsotry-catch
muss ein verwendet werden, um diesen Fehlertry { JSON.parse(data3) } catch(e) { isValidJSON = false }
Sie könnten versuchen, es zu dekodieren und die Ausnahme abzufangen (native oder json2.js ):
Ich würde jedoch vorschlagen, dass die Antwort immer gültig ist. Wenn Sie von Ihrer MySQL-Abfrage einen Fehler zurückerhalten, senden Sie einfach JSON mit dem Fehler zurück:
Und dann:
quelle
Warnung: Bei Methoden, die sich auf
JSON.parse
- Arrays und in Anführungszeichen umgebene Zeichenfolgen verlassen, werden diese ebenfalls übergeben (z. B.console.log(JSON.parse('[3]'), JSON.parse('"\uD800"'))
).Um alle Nicht-Objekt-JSON-Grundelemente (Boolescher Wert, Nullwert, Array, Zahl, Zeichenfolge) zu vermeiden, empfehle ich Folgendes:
Code Erklärung
Warum nicht die Antwort hasJsonStructure () verwenden?
Sich darauf zu verlassen
toString()
ist keine gute Idee. Dies liegt daran, dass verschiedene JavaScript-Engines möglicherweise eine andere Zeichenfolgendarstellung zurückgeben. Im Allgemeinen können Methoden, die darauf basieren, in verschiedenen Umgebungen fehlschlagen oder später fehlschlagen, falls die Engine jemals das Ergebnis der Zeichenfolge ändertWarum ist das Fangen einer Ausnahme kein Hack?
Es wurde darauf hingewiesen, dass das Abfangen einer Ausnahme zur Bestimmung der Gültigkeit von etwas niemals der richtige Weg ist. Dies ist im Allgemeinen ein guter Rat, aber nicht immer. In diesem Fall ist das Abfangen von Ausnahmen wahrscheinlich der beste Weg, da es auf der Implementierung der JSON-Daten durch die JavaScript-Engine beruht.
Das Verlassen auf die JS-Engine bietet die folgenden Vorteile:
Wenn Sie die Möglichkeit haben, sich auf die JavaScript-Engine zu stützen, würde ich vorschlagen, dies zu tun. Besonders in diesem Fall. Obwohl es sich hackig anfühlt, eine Ausnahme abzufangen, behandeln Sie wirklich nur zwei mögliche Rückgabezustände von einer externen Methode.
quelle
Hier ist ein Code mit geringfügigen Änderungen in Bournes Antwort. Da JSON.parse (Nummer) ausnahmslos einwandfrei funktioniert, wird isNaN hinzugefügt.
quelle
Alle JSON-Zeichenfolgen beginnen mit '{' oder '[' und enden mit dem entsprechenden '}' oder ']'. Überprüfen Sie dies einfach.
So macht es Angular.js:
https://github.com/angular/angular.js/blob/v1.6.x/src/ng/http.js
quelle
{ someValue }
wird die Validierung automatisch bestanden.Ich schlage im Typescript-Modus vor:
quelle
Ich habe diese verwendet (eine Art Mischung aus verschiedenen Antworten, aber trotzdem):
quelle
Sie können Folgendes versuchen, da es auch Zahl, Null und Zeichenfolge überprüft, aber die oben markierte Antwort nicht richtig funktioniert. Es handelt sich lediglich um eine Korrektur der oben genannten Funktion:
quelle
Zusätzlich zu früheren Antworten können Sie den folgenden Code verwenden, wenn Sie ein JSON-Format wie "{}" validieren müssen:
Anwendungsbeispiele: