Wie teste ich, ob eine Zeichenfolge JSON ist oder nicht?

191

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, isJSONgenau wie Sie die Funktion verwenden können, um instanceofzu testen, ob etwas ein Array ist.

Das ist was ich will:

if (isJSON(data)){
    //do some data stuff
}else{
    //report the error
    alert(data);
}
jeffery_the_wind
quelle
Vielleicht verwenden, eval()wenn es undefineddann zurückkehrt , ist es nicht JSON
MatuDuke
4
Dies wurde hier gelöst: stackoverflow.com/questions/3710204/…
Reinard
2
Vielen Dank an alle, sorry, dass ich diesen anderen Beitrag noch nicht gefunden habe.
jeffery_the_wind
1
Technisch gesehen ist dies kein Betrug von 3710204, da dieser fragt, ob es sich um einen gültigen JSON handelt, der ein viel höherer Balken ist als der JSON überhaupt.
carlin.scott
Mögliches Duplikat von AJAX: Überprüfen Sie, ob eine Zeichenfolge JSON ist?
Mehdi Dehghani

Antworten:

318

Verwenden Sie JSON.parse

function isJson(str) {
    try {
        JSON.parse(str);
    } catch (e) {
        return false;
    }
    return true;
}
Bourne
quelle
53
Die Ausnahmebehandlung sollte nicht verwendet werden, um etwas zu tun, was erwartet wird.
LuisZavaleta
44
JSON.parse(1234)ODER JSON.parse(0)ODER JSON.parse(false)ODER JSON.parse(null)alle werden keine Ausnahme auslösen und true zurückgeben !!. Verwenden Sie diese Antwort nicht
Zalaboza
19
@Zalaboza 1234, 0, false, und nullsind 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.
Michael Lang
20
JSON.parsefü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 stattdessen return {value: JSON.parse(str), valid: true};und im catch-Block return {value: str, valid: false};.. und ich würde den Funktionsnamen in ändern tryParse().
Nawaz
7
@luisZavaleta dann was schlagen Sie als Methode vor
PirateApp
79

Dieser Code ist JSON.parse(1234)oder JSON.parse(0)oder JSON.parse(false)oder JSON.parse(null)alle geben true zurück.

function isJson(str) {
    try {
        JSON.parse(str);
    } catch (e) {
        return false;
    }
    return true;
}

Also habe ich den Code folgendermaßen umgeschrieben:

function isJson(item) {
    item = typeof item !== "string"
        ? JSON.stringify(item)
        : item;

    try {
        item = JSON.parse(item);
    } catch (e) {
        return false;
    }

    if (typeof item === "object" && item !== null) {
        return true;
    }

    return false;
}

Testergebnis:

isJson Testergebnis

kubosho_
quelle
4
Gute Arbeit! Ihre letzte if-Anweisung könnte zu einer einfachen return-Anweisung vereinfacht werden, wie zum Beispiel:return (typeof suspect === "object" && suspect !== null);
Nebulosar
37

Lassen Sie uns dies noch einmal zusammenfassen (für 2019+).

Argument : Werte wie true, false, nullgelten JSON (?)

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).

Argument : Die Ausnahmebehandlung sollte nicht verwendet werden, um etwas zu tun, was erwartet wird.
(Dies ist ein Kommentar mit mehr als 25 positiven Stimmen!)

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.

function hasJsonStructure(str) {
    if (typeof str !== 'string') return false;
    try {
        const result = JSON.parse(str);
        const type = Object.prototype.toString.call(result);
        return type === '[object Object]' 
            || type === '[object Array]';
    } catch (err) {
        return false;
    }
}

Verwendung:

hasJsonStructure('true')             // —» false
hasJsonStructure('{"x":true}')       // —» true
hasJsonStructure('[1, false, null]') // —» true

safeJsonParse()

Dies ist nützlich, wenn Sie beim Parsen einiger Daten auf einen JavaScript-Wert vorsichtig sein möchten.

function safeJsonParse(str) {
    try {
        return [null, JSON.parse(str)];
    } catch (err) {
        return [err];
    }
}

Verwendung:

const [err, result] = safeJsonParse('[Invalid JSON}');
if (err) {
    console.log('Failed to parse JSON: ' + err.message);
} else {
    console.log(result);
}
Onur Yıldırım
quelle
1
Der Link zur JSON-Spezifikation lautet wie folgt: "Ein JSON-Text ist eine Folge von Token, die aus Unicode-Codepunkten gebildet werden und der JSON-Wertgrammatik entsprechen." und "Ein JSON-Wert kann ein Objekt, ein Array, eine Zahl, eine Zeichenfolge, wahr, falsch oder null sein." - Wie sind Sie zu dem Schluss gekommen, dass ein JSON nur Objekt oder Array auf Stammebene sein kann? Ich kann dies weder in der Spezifikation noch in Bezug auf "wohlgeformte JSON-Strukturen" sehen
Relequestual
Lesen Sie den zweiten Absatz, der mit "JSON basiert auf zwei Strukturen ..." @ json.org oder den vierten und fünften Absätzen von ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf
Onur Yıldırım
json.org ist nur informativ. Das Lesen der von Ihnen verlinkten Spezifikation unterstützt Ihren Vorschlag nicht. In der Spezifikation wird RFC 8259 als neuester RFC erwähnt. Schauen Sie sich Beispiele für gültige JSON-Texte an, die nur Werte enthalten. Tools.ietf.org/html/rfc8259#section-13 - RFC 8259 wurde entwickelt, um mögliche Mehrdeutigkeiten und Verwirrungen auf diese Weise zu beheben.
Relequestual
Lesen Sie die Antwort noch einmal. Ich sage, Werte wie Grundelemente (dh Textwerte in den RFC-Beispielen) sind keine JSON- "Strukturen". Es gibt keine Unklarheiten. Sie können sie als JSON analysieren. Dies ist gültig. Sie sind jedoch keine strukturierten Daten. JSON wurde hauptsächlich als Austauschformat »erfunden, das für strukturierte Daten verwendet wird», die ein Objekt oder ein Array sein können.
Onur Yıldırım
1
OK, ich denke wir sind uns einig. Primative sind gemäß der Spezifikation gültige JSON, aber keine "Strukturen". Das ist gut. Sie sagten jedoch: "Argument: Werte wie true, false, null sind gültige JSON (?). Fakt: Ja und Nein!" - Tatsache ist, dass der ARE-gültige JSON gemäß der Spezifikation ist. Meinungen darüber, ob sie nützlich sind oder nicht, sind für diese Tatsache irrelevant.
Relequestual
20

Wenn der Server mit JSON antwortet, hat er einen application/jsonInhaltstyp. Wenn er mit einer Nur-Text-Nachricht antwortet, sollte er einen text/plainInhaltstyp haben. Stellen Sie sicher, dass der Server mit dem richtigen Inhaltstyp antwortet, und testen Sie dies.

QUentin
quelle
4
Das ist falsch, es gibt viele andere json-kompatible Mediatypen. Außerdem overrideMimeTypekann der Inhaltstyp-Header überschrieben werden.
Knu
13

Wenn jQuery $.ajax()die Antwort verwendet wird, hat sie die responseJSONEigenschaft, wenn die Antwort JSON war. Dies kann folgendermaßen überprüft werden:

if (xhr.hasOwnProperty('responseJSON')) {}
rémy
quelle
2
Dies ist, wie ich vermute, wirklich die Antwort, nach der die meisten Menschen suchen, wahrscheinlich sogar die OP
Kirby
Dies ist viel eleganter als die Verwendung des Try-Catch-Blocks
Anurag Sinha
6

Ich mag die beste Antwort, aber wenn es eine leere Zeichenfolge ist, gibt sie true zurück. Also hier ist eine Lösung:

function isJSON(MyTestStr){
    try {
        var MyJSON = JSON.stringify(MyTestStr);
        var json = JSON.parse(MyJSON);
        if(typeof(MyTestStr) == 'string')
            if(MyTestStr.length == 0)
                return false;
    }
    catch(e){
        return false;
    }
    return true;
}
Lonnie Price Sr.
quelle
var json wird nicht verwendet? oder nur um den Fehler zu fangen?
Stackdave
5
var parsedData;

try {
    parsedData = JSON.parse(data)
} catch (e) {
    // is not a valid JSON string
}

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:

{"error" : { "code" : 123, "message" : "Foo not supported" } } 

Und vielleicht verwenden Sie neben dem HTTP-Status auch einen 5xx-Code.

ZER0
quelle
5

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:

$.ajax({
  type: 'POST',
  url: 'test2.php',
  data: "data",
  success: function (response){

        //Supposing x is a JSON property...
        alert(response.x);

  },
  dataType: 'json',
  //Invalid JSON
  error: function (){ alert("error!"); }
});

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:

$.ajax({
  type: 'POST',
  url: 'test2.php',
  data: "data",
  success: function (response){

        try {
            parsedData = JSON.parse(response);
        } catch (e) {
            // is not a valid JSON string
        }

  },
  dataType: 'text',
});
Lucas Batistussi
quelle
es sei denn, Sie versuchen natürlich, den Fehlertext in der Fehlerfunktion im obigen Beispiel zu analysieren und sind sich nicht sicher, ob es sich um JSON handelt ...
Kirby
Tolle Antwort, obwohl wenn responseleer, geht es zu success: '(
Henrik Petterson
4

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:

{ "status": "success", "data": [ <your data here> ] }

Fehlerhafter Anruf:

{ "status": "error", "error": "Database not found" }

Dies würde das Schreiben Ihrer clientseitigen JS erheblich vereinfachen. Sie müssen lediglich das "Status" -Mitglied überprüfen und entsprechend handeln.

mdm
quelle
4

Ich benutze nur 2 Zeilen, um das auszuführen:

var isValidJSON = true;
try { JSON.parse(jsonString) } catch { isValidJSON = false }

Das ist alles!

Beachten Sie jedoch, dass es zwei Traps gibt:
1. JSON.parse(null)Gibt null
2. zurück . Jede Zahl oder Zeichenfolge kann mit der JSON.parse()Methode analysiert werden.
   JSON.parse("5")gibt 5
   JSON.parse(5)zurück gibt zurück5

Lassen Sie uns etwas mit Code spielen:

// TEST 1
var data = '{ "a": 1 }'

// Avoiding 'null' trap! Null is confirmed as JSON.
var isValidJSON = data ? true : false
try { JSON.parse(data) } catch(e) { isValidJSON = false }

console.log("data isValidJSON: ", isValidJSON);
console.log("data isJSONArray: ", isValidJSON && JSON.parse(data).length ? true : false);

Console outputs:
data isValidJSON:  true
data isJSONArray:  false


// TEST 2
var data2 = '[{ "b": 2 }]'

var isValidJSON = data ? true : false
try { JSON.parse(data2) } catch(e) { isValidJSON = false }

console.log("data2 isValidJSON: ", isValidJSON);
console.log("data2 isJSONArray: ", isValidJSON && JSON.parse(data2).length ? true : false);

Console outputs:
data2 isValidJSON:  true
data2 isJSONArray:  true


// TEST 3
var data3 = '[{ 2 }]'

var isValidJSON = data ? true : false
try { JSON.parse(data3) } catch(e) { isValidJSON = false }

console.log("data3 isValidJSON: ", isValidJSON);
console.log("data3 isJSONArray: ", isValidJSON && JSON.parse(data3).length ? true : false);

Console outputs:
data3 isValidJSON:  false
data3 isJSONArray:  false


// TEST 4
var data4 = '2'

var isValidJSON = data ? true : false
try { JSON.parse(data4) } catch(e) { isValidJSON = false }

console.log("data4 isValidJSON: ", isValidJSON);
console.log("data4 isJSONArray: ", isValidJSON && JSON.parse(data4).length ? true : false);


Console outputs:
data4 isValidJSON:  true
data4 isJSONArray:  false


// TEST 5
var data5 = ''

var isValidJSON = data ? true : false
try { JSON.parse(data5) } catch(e) { isValidJSON = false }

console.log("data5 isValidJSON: ", isValidJSON);
console.log("data5 isJSONArray: ", isValidJSON && JSON.parse(data5).length ? true : false);


Console outputs:
data5 isValidJSON:  false
data5 isJSONArray:  false

// TEST 6
var data6; // undefined

var isValidJSON = data ? true : false
try { JSON.parse(data6) } catch(e) { isValidJSON = false }

console.log("data6 isValidJSON: ", isValidJSON);
console.log("data6 isJSONArray: ", isValidJSON && JSON.parse(data6).length ? true : false);

Console outputs:
data6 isValidJSON:  false
data6 isJSONArray:  false
efkan
quelle
Ich habe unter jsfiddle.net/fatmonk/gpn4eyav eine Geige für diese Antwort erstellt, die die Option enthält, auch eigene Benutzertestdaten hinzuzufügen. Dies scheint mir die Grundlage einer guten Bibliotheksfunktion zu sein, aber ich möchte mehr darüber verstehen, warum Test 1 kein gültiges JSON-Array ist.
Fat Monk
Weil ein Array mit [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!
Efkan
So einfach ist das?! Test 1 ist also ein JSON-Objekt und Test 2 ist ein JSON-Array, das aus einem einzelnen JSON-Objektelement besteht. Habe ich das richtig verstanden?
Fat Monk
Die Frage, die als mögliches Duplikat davon gekennzeichnet ist ( stackoverflow.com/questions/3710204/… ), fragt nach dem Erreichen dieses Ziels , ohne try / catch zu verwenden. Deshalb habe ich meine Geige gegabelt, um auch dieses Ziel zu erreichen. Die Gabel befindet sich unter jsfiddle.net/fatmonk/827jsuvr und funktioniert mit allen oben genannten Tests, mit Ausnahme von Test 3, bei dem Fehler auftreten JSON.parse. Kann jemand raten, wie dieser Fehler vermieden werden kann, ohne try zu verwenden?
Fat Monk
Ihre jsfiddleAnwendung gibt einen Fehler aus, da Test 3 keinen gültigen JSON-Ausdruck hat. Also try-catchmuss ein verwendet werden, um diesen Fehler try { JSON.parse(data3) } catch(e) { isValidJSON = false }
abzufangen
2

Sie könnten versuchen, es zu dekodieren und die Ausnahme abzufangen (native oder json2.js ):

try {
  newObj = JSON.parse(myJsonString);
} catch (e) {
  console.log('Not JSON');
}

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:

{"error":"The MySQL error string."}

Und dann:

if (myParsedJSON.error) {
  console.log('An error occurred: ' + myParsedJSON.error);
}
James Sumners
quelle
2

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:

/* Validate a possible object ie. o = { "a": 2 } */
const isJSONObject = (o) => 
  !!o && (typeof o === 'object') && !Array.isArray(o) && 
  (() => { try { return Boolean(JSON.stringify(o)); } catch { return false } })()

/* Validate a possible JSON object represented as string ie. s = '{ "a": 3 }' */
function isJSONObjectString(s) {
    try {
        const o = JSON.parse(s);
        return !!o && (typeof o === 'object') && !Array.isArray(o)
    } catch {
        return false
    }
}

Code Erklärung

  • !! o - Nicht falsch (ausgenommen null, das als Typ von 'Objekt' registriert wird)
  • (typeof o === 'object') - Schließt Boolesche Werte , Zahlen und Zeichenfolgen aus
  • ! Array.isArray (o) - Arrays ausschließen (die sich als Typ von 'Objekt' registrieren)
  • try ... JSON.stringify / JSON.parse - Fordert die JavaScript-Engine auf, festzustellen, ob JSON gültig ist

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 ändert

Warum 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:

  1. Gründlicher und ständig auf dem neuesten Stand, wenn sich die JSON-Spezifikationen ändern
  2. Läuft wahrscheinlich schneller (da es sich um Code auf niedrigerer Ebene handelt)

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.

Ron S.
quelle
1

Hier ist ein Code mit geringfügigen Änderungen in Bournes Antwort. Da JSON.parse (Nummer) ausnahmslos einwandfrei funktioniert, wird isNaN hinzugefügt.

function isJson(str) {
    try {
        JSON.parse(str);
    } catch (e) {
        return false;
    }
    return isNaN(str);
}
Devashish Mamgain
quelle
0

Alle JSON-Zeichenfolgen beginnen mit '{' oder '[' und enden mit dem entsprechenden '}' oder ']'. Überprüfen Sie dies einfach.

So macht es Angular.js:

var JSON_START = /^\[|^\{(?!\{)/;
var JSON_ENDS = {
  '[': /]$/,
  '{': /}$/
};

function isJsonLike(str) {
    var jsonStart = str.match(JSON_START);
    return jsonStart && JSON_ENDS[jsonStart[0]].test(str);
}

https://github.com/angular/angular.js/blob/v1.6.x/src/ng/http.js

carlin.scott
quelle
@DukeDougal zu klären? Manchmal beginnen Leute ihren json mit einem '[', aber das ist nicht besonders häufig.
carlin.scott
1
Sie müssen es analysieren, um herauszufinden, ob JSON gültig ist. Wenn es sich um ungültiges JSON handelt, handelt es sich nicht um JSON. Die Frage lautet "Wie kann man sagen, ob eine Zeichenfolge JSON ist oder nicht?". Nach Ihrem Ansatz wäre dies JSON {fibble - und es ist wirklich nicht JSON. Betrachten Sie auch Fälle wie die Nummer 1 für sich - das ist gültiger JSON.
Duke Dougal

1
"Wenn es ungültiges JSON ist, ist es nicht JSON". Die Tatsache, dass Sie das Wort "gültig" verwenden müssen, zeigt, dass Sie der Tatsache, dass es mehr als nur json ist, eine Qualifikation hinzufügen. Die Frage war einfach "is it json" und mein Codebeispiel beantwortet diese Frage perfekt, ohne zusätzliche Anforderungen anzunehmen.
carlin.scott

Eine schlechte Idee, wenn Sie einige Vorlagensysteme verwenden und so etwas haben, { someValue }wird die Validierung automatisch bestanden.
Ncubica

@ncubica Wenn Sie also eine Vorlage für etwas anderes als json verwenden, enthält die Zeichenfolge nur einen Platzhalter, der geschweifte Klammern verwendet, und die Vorlagen-Engine kann den Platzhalter nicht durch den tatsächlichen Wert ersetzen. Denken Sie auch daran, wie ich Duke bereits erklärt habe, dass die ursprüngliche Frage die Validierung nicht erwähnt. Sie wollten nur wissen, ob es nach json aussah oder nicht.
carlin.scott

0

Ich schlage im Typescript-Modus vor:

export function stringify(data: any): string {
    try {
         return JSON.stringify(data)
    } catch (e) {
         return 'NOT_STRINGIFIABLE!'
    }
}

0

Ich habe diese verwendet (eine Art Mischung aus verschiedenen Antworten, aber trotzdem):

const isJSON = str => {
  if (typeof str === 'string'){
    try {
      JSON.parse(str)
      return true
    } catch(e){
    }
  }
  return false
}



[null, undefined, false, true, [], {}, 
 '', 'asdf', '{}', '[]', "{\"abc\": 2}","{\"abc\": \"2\"}"]
  .map(el => {
      console.log(`[>${el}<] - ${isJSON(el)}`)
})

console.log('-----------------')


0

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:

function isJson(str) {
  try {
      const obj = JSON.parse(str);
      if (obj && typeof obj === `object`) {
        return true;
      }
    } catch (err) {
      return false;
    }
   return false;
}

-1

Zusätzlich zu früheren Antworten können Sie den folgenden Code verwenden, wenn Sie ein JSON-Format wie "{}" validieren müssen:

const validateJSON = (str) => {
  try {
    const json = JSON.parse(str);
    if (Object.prototype.toString.call(json).slice(8,-1) !== 'Object') {
      return false;
    }
  } catch (e) {
    return false;
  }
  return true;
}

Anwendungsbeispiele:

validateJSON('{}')
true
validateJSON('[]')
false
validateJSON('')
false
validateJSON('2134')
false
validateJSON('{ "Id": 1, "Name": "Coke" }')
true
K.King