Nicht erfasster SyntaxError: Unerwartetes Token mit JSON.parse

190

Was verursacht diesen Fehler in der dritten Zeile?

var products = [{
  "name": "Pizza",
  "price": "10",
  "quantity": "7"
}, {
  "name": "Cerveja",
  "price": "12",
  "quantity": "5"
}, {
  "name": "Hamburguer",
  "price": "10",
  "quantity": "2"
}, {
  "name": "Fraldas",
  "price": "6",
  "quantity": "2"
}];
console.log(products);
var b = JSON.parse(products); //unexpected token o

Öffnen Sie die Konsole, um den Fehler anzuzeigen

coiso
quelle
16
Sie haben keinen JSON? Es ist ein Array / Objekt-Literal.
Bergi

Antworten:

219

productsist ein Objekt. (Erstellen aus einem Objektliteral)

JSON.parse()wird verwendet, um eine Zeichenfolge mit JSON-Notation in ein Javascript-Objekt zu konvertieren .

Ihr Code verwandelt das Objekt in eine Zeichenfolge (durch Aufrufen .toString()), um zu versuchen, es als JSON-Text zu analysieren.
Die .toString()Standarderklärungen "[object Object]", die nicht gültig JSON ist; daher der Fehler.

SLaks
quelle
1
ist es kein Array? Warum ist es ein Objekt? Objekte beginnen mit {und Arrays beginnen mit [? oder bin ich hier falsch
4
Arrays sind Objekte; das ist, was .toString()zurückkommt (gemäß der Spezifikation).
SLaks
1
Ist die Lösung, das Objekt zuerst zu stringifizieren?
Mohammed Noureldin
6
@ MohammedNoureldin: Nein; Die Lösung besteht darin, nichts zu tun und Ihr Objekt zu verwenden.
SLaks
1
Was passiert, wenn ich meine Daten mit Ajax von einem Remote-Dienst erhalte, der mir eine Antwort von Json gibt? Und ich möchte, dass diese Antwort im JavaScript-Array-Objekt gespeichert wird?
Mohammed Noureldin
126

Angenommen, Sie wissen, dass JSON gültig ist, aber Sie erhalten dies immer noch ...

In diesem Fall ist es wahrscheinlich, dass die Zeichenfolge versteckte / spezielle Zeichen enthält, aus welcher Quelle auch immer Sie sie erhalten. Wenn Sie in einen Validator einfügen, gehen sie verloren - aber in der Zeichenfolge sind sie noch vorhanden. Diese Zeichen sind zwar unsichtbar, brechen jedochJSON.parse()

Wenn ses sich um Ihren rohen JSON handelt, bereinigen Sie ihn mit:

// preserve newlines, etc - use valid JSON
s = s.replace(/\\n/g, "\\n")  
               .replace(/\\'/g, "\\'")
               .replace(/\\"/g, '\\"')
               .replace(/\\&/g, "\\&")
               .replace(/\\r/g, "\\r")
               .replace(/\\t/g, "\\t")
               .replace(/\\b/g, "\\b")
               .replace(/\\f/g, "\\f");
// remove non-printable and other non-valid JSON chars
s = s.replace(/[\u0000-\u0019]+/g,""); 
var o = JSON.parse(s);
EdH
quelle
Ich habe den Fehler erhalten und ihn auf ein seltsames Zeichen in einer Zeichenfolge zurückgeführt. Ich habe Ihre Methode zum Entfernen der ungültigen JSON-Zeichen verwendet und es hat funktioniert.
Albertski
1
bin jetzt zweimal hierher gekommen. Danke
Benjamin Hoffman
Nach der Base64-Dekodierung wurde ein nachfolgendes Sonderzeichen angezeigt. Ihre Methode hat mir sehr geholfen! Thx
Guillaume
Vertraue keiner Quelle, die mit ungültigem JSON antwortet. Informieren Sie sie einfach, dass die Daten beschädigt sind. sie sollten es reparieren. Wenn Sie versuchen, die Antwort wie folgt oder auf ähnliche Weise wiederherzustellen, bleibt die Kommunikation instabil.
Onur Yıldırım
Sollte s = s.replace(/[\u0000-\u001F]+/g,""); statt sein s = s.replace(/[\u0000-\u0019]+/g,""); , um alle Steuerzeichen zu ersetzen. Richtig?
HongchaoZhang
63

Es scheint, dass Sie das Objekt stringifizieren möchten . Also mach das:

JSON.stringify(products);

Der Grund für den Fehler ist, JSON.parse()dass ein StringWert erwartet wird und productsein Array.

Hinweis: Ich denke, es versucht, json.parse('[object Array]')was sich beschwert, dass es kein Token odanach erwartet hat [.

Onur Yıldırım
quelle
28

Ich habe das gleiche Problem mit gefunden JSON.parse(inputString).

In meinem Fall stammt die Eingabezeichenfolge von meiner Serverseite [Rückgabe einer Seitenmethode] .

Ich habe die typeof(inputString)- es war Zeichenfolge gedruckt , trotzdem tritt der Fehler auf.

Ich habe es auch versucht JSON.stringify(inputString), aber es hat nicht geholfen.

Später stellte ich fest, dass dies ein Problem mit dem neuen Zeilenoperator [\n]innerhalb eines Feldwerts ist.

Ich habe ersetzt [durch ein anderes Zeichen, setze die neue Zeile nach dem Parsen zurück] und alles funktioniert gut.

Derin
quelle
2
Das neue Linienzeichen war auch mein Problem. Wie können wir solche Daten wiederherstellen?
Kolenda
@kolenda Sie haben ungültigen JSON. Sie müssen Ihren Server ändern, um einen tatsächlichen JSON-Serializer zu verwenden, der gültigen JSON zurückgibt.
SLaks
Ich hatte ein ähnliches Problem, aber anstelle von "\ n" hatte ich ein "\ e" in einem Pfad (ich habe den serverseitigen Code geändert, um "/" anstelle von "\" zu verwenden, und alles funktionierte wieder)
Adam Tal
Verwenden Sie eine Flucht, bei der \ n \\ n wäre
Paul Gregoire
13

JSON.parse wartet auf einen String im Parameter. Sie müssen Ihr JSON-Objekt stringifizieren, um das Problem zu lösen.

products = [{"name":"Pizza","price":"10","quantity":"7"}, {"name":"Cerveja","price":"12","quantity":"5"}, {"name":"Hamburguer","price":"10","quantity":"2"}, {"name":"Fraldas","price":"6","quantity":"2"}];
console.log(products);
var b = JSON.parse(JSON.stringify(products));  //solves the problem
Térence
quelle
12
products = [{"name":"Pizza","price":"10","quantity":"7"}, {"name":"Cerveja","price":"12","quantity":"5"}, {"name":"Hamburguer","price":"10","quantity":"2"}, {"name":"Fraldas","price":"6","quantity":"2"}];

ändern

products = '[{"name":"Pizza","price":"10","quantity":"7"}, {"name":"Cerveja","price":"12","quantity":"5"}, {"name":"Hamburguer","price":"10","quantity":"2"}, {"name":"Fraldas","price":"6","quantity":"2"}]';
pktangyue
quelle
2
@Slaks yep, OP kann Produkte direkt verwenden. aber wenn er verwenden möchte JSON.parse, müssen die Argumente eine Zeichenfolge sein.
pktangyue
Was soll ich in ASP Classic tun, weil 'ein Kommentar ist
ashish bhatt
1
@ashishbhatt können Sie verwenden ", dann ändern Sie alle anderen" in \ "
pktangyue
2
So etwas in der ArtJSON.parse(products.replace(/'/g, '"'))
Chemical Programmer
10

Sie sollten Ihre JSON-Zeichenfolge hier überprüfen .

Eine gültige JSON-Zeichenfolge muss in doppelten Anführungszeichen um die Schlüssel stehen:

JSON.parse({"u1":1000,"u2":1100})       // will be ok

Wenn keine Anführungszeichen vorhanden sind, wird ein Fehler verursacht:

JSON.parse({u1:1000,u2:1100})    
// error Uncaught SyntaxError: Unexpected token u in JSON at position 2

Die Verwendung von einfachen Anführungszeichen führt ebenfalls zu einem Fehler:

JSON.parse({'u1':1000,'u2':1100})    
// error Uncaught SyntaxError: Unexpected token ' in JSON at position 1
hoogw
quelle
In meinem Fall wurde Grails 2.5.6 render ([key: value])mit einfachen Anführungszeichen gerendert , was zu JSON parseError an Position 1 in jquery Ajax führte. render (groovy.json.JsonOutput.toJson ([key:value]))hat mir geholfen.
Philburns
3
[
  {
    "name": "Pizza",
    "price": "10",
    "quantity": "7"
  },
  {
    "name": "Cerveja",
    "price": "12",
    "quantity": "5"
  },
  {
    "name": "Hamburguer",
    "price": "10",
    "quantity": "2"
  },
  {
    "name": "Fraldas",
    "price": "6",
    "quantity": "2"
  }
]

Hier ist dein perfekter Json, den du analysieren kannst.

San
quelle
3

Hier ist eine Funktion, die ich basierend auf früheren Antworten erstellt habe: Sie funktioniert auf meinem Computer, aber auf YMMV.

          /**
             * @description Converts a string response to an array of objects.
             * @param {string} string - The string you want to convert.
             * @returns {array} - an array of objects.
            */
            function stringToJson(input) {
              var result = [];

              //replace leading and trailing [], if present
              input = input.replace(/^\[/,'');
              input = input.replace(/\]$/,'');

              //change the delimiter to 
              input = input.replace(/},{/g,'};;;{');

              // preserve newlines, etc - use valid JSON
              ///programming/14432165/uncaught-syntaxerror-unexpected-token-with-json-parse
            input = input.replace(/\\n/g, "\\n")  
            .replace(/\\'/g, "\\'")
            .replace(/\\"/g, '\\"')
            .replace(/\\&/g, "\\&")
            .replace(/\\r/g, "\\r")
            .replace(/\\t/g, "\\t")
            .replace(/\\b/g, "\\b")
            .replace(/\\f/g, "\\f");
            // remove non-printable and other non-valid JSON chars
            input = input.replace(/[\u0000-\u0019]+/g,""); 

              input = input.split(';;;');

              input.forEach(function(element) {
                // console.log(JSON.stringify(element));

                result.push(JSON.parse(element));
              }, this);

              return result;
            }
tmurphree
quelle
2

Ein weiteres Problem, das "SyntaxError: Unexpected token"beim Aufrufen zu Ausnahmen führen kann, JSON.parse()ist die Verwendung einer der folgenden Zeichenfolgenwerte:

  1. Zeilenumbrüche.

  2. Registerkarten (ja, Registerkarten, die Sie mit der Tabulatortaste erstellen können!)

  3. Jeder eigenständige Schrägstrich \(aber aus irgendeinem Grund nicht /, zumindest nicht auf Chrome.)

(Eine vollständige Liste finden Sie im Abschnitt String hier .)

Zum Beispiel erhalten Sie diese Ausnahme:

{
    "msg" : {
        "message": "It cannot
contain a new-line",
        "description": "Some discription with a     tabbed space is also bad",
        "value": "It cannot have 3\4 un-escaped"
    }
}

Also sollte es geändert werden zu:

{
    "msg" : {
        "message": "It cannot\ncontain a new-line",
        "description": "Some discription with a\t\ttabbed space",
        "value": "It cannot have 3\\4 un-escaped"
    }
}

Was es, sollte ich sagen, im Nur-JSON-Format mit größerer Textmenge ziemlich unlesbar macht.

c00000fd
quelle
1

Hoffentlich hilft das jemand anderem.

Mein Problem war, dass ich HTML in einer PHP-Rückruffunktion über AJAX kommentiert hatte, die die Kommentare analysierte und ungültiges JSON zurückgab.

Nachdem ich den kommentierten HTML-Code entfernt hatte, war alles in Ordnung und der JSON wurde ohne Probleme analysiert.

Chris
quelle
0

Produkte ist ein Array, das direkt verwendet werden kann:

var i, j;

for(i=0;i<products.length;i++)
  for(j in products[i])
    console.log("property name: " + j,"value: "+products[i][j]);
ic3b3rg
quelle
0

Nun offenbar \r, \b, \t, \f, etc. sind nicht die einzigen problematischen Zeichen , dass Sie diesen Fehler geben kann.

Beachten Sie, dass einige Browser möglicherweise zusätzliche Anforderungen für die Eingabe von haben JSON.parse.

Führen Sie diesen Testcode in Ihrem Browser aus:

var arr = [];
for(var x=0; x < 0xffff; ++x){
    try{
        JSON.parse(String.fromCharCode(0x22, x, 0x22));
    }catch(e){
        arr.push(x);
    }
}
console.log(arr);

Beim Testen auf Chrome sehe ich, dass es nicht erlaubt, JSON.parse(String.fromCharCode(0x22, x, 0x22));wo x34, 92 oder von 0 bis 31 sind.

Chars 34 und 92 sind die "und \Zeichen sind, und sie sind in der Regel erwartet und richtig übersetzt . Es sind die Zeichen 0 bis 31, die Ihnen Probleme bereiten würden.

Bevor Sie das Debuggen unterstützen, stellen Sie JSON.parse(input)zunächst sicher, dass die Eingabe keine problematischen Zeichen enthält:

function VerifyInput(input){
    for(var x=0; x<input.length; ++x){
        let c = input.charCodeAt(x);
        if(c >= 0 && c <= 31){
            throw 'problematic character found at position ' + x;
        }
    }
}
Pacerier
quelle
0

Warum brauchen Sie JSON.parse? Es ist bereits im Array des Objektformats.

Verwenden Sie JSON.stringify besser wie folgt: var b = JSON.stringify(products);

Dies kann Ihnen helfen.

Abhijit Padhy
quelle
0

Oh Mann, Lösungen in allen oben genannten Antworten haben bei mir nicht funktioniert. Ich hatte gerade ein ähnliches Problem. Ich habe es geschafft, es mit dem Zitat zu lösen. Siehe den Screenshot. Whoo.

Geben Sie hier die Bildbeschreibung ein

Original:

var products = [{
  "name": "Pizza",
  "price": "10",
  "quantity": "7"
}, {
  "name": "Cerveja",
  "price": "12",
  "quantity": "5"
}, {
  "name": "Hamburguer",
  "price": "10",
  "quantity": "2"
}, {
  "name": "Fraldas",
  "price": "6",
  "quantity": "2"
}];
console.log(products);
var b = JSON.parse(products); //unexpected token o

Nun, Smith
quelle
0

Der Fehler, den Sie erhalten, dh "unerwartetes Token o", ist, dass json erwartet wird, aber das Objekt beim Parsen erhalten wird. Das "o" ist der erste Buchstabe des Wortes "Objekt".

Shashank Bodkhe
quelle
0

Der einzige Fehler, den Sie machen, ist, dass Sie bereits analysierte Objekte analysieren, sodass ein Fehler ausgelöst wird. Verwenden Sie diese Option, und Sie können loslegen.

var products = [{
  "name": "Pizza",
  "price": "10",
  "quantity": "7"
}, {
  "name": "Cerveja",
  "price": "12",
  "quantity": "5"
}, {
  "name": "Hamburguer",
  "price": "10",
  "quantity": "2"
}, {
  "name": "Fraldas",
  "price": "6",
  "quantity": "2"
}];
console.log(products[0].name); //name of item at 0th index

Wenn Sie den gesamten JSON drucken möchten, verwenden Sie JSON.stringify ()

Kiran Maniya
quelle
0

Dies kann aus vielen Gründen geschehen, wahrscheinlich jedoch aufgrund eines ungültigen JSON.stringify(obj);Zeichens. Sie können also verwenden , um Ihr Objekt in einen JSON zu verwandeln. Denken Sie jedoch daran, dass es sich um einen JQUERY-Ausdruck handelt.

Elvis Silva Noleto
quelle
0

Ich habe diesen Fehler, weil die API, die das JSON-Objekt zurückgegeben hat, einen Fehler ausgegeben hat (in meinem Fall Code Igniter, geben Sie einen HTML-Code zurück, wenn der PHP-Code fehlschlägt), sodass es sich nicht um ein JSON-Objekt handelt.

Überprüfen Sie die SQL-Sätze und den PHP-Code und testen Sie ihn mit Postman (oder einem anderen API-Tester).

Ari Waisberg
quelle
0

Der Fehler, den ich machte, ging vorbei null (unwissentlich) an JSON.parse () übergeben.

Also warf es Unexpected token n in JSON at position 0

Aashutosh Rathi
quelle
-24

Verwenden Sie eval. Es verwendet JavaScript-Ausdruck / Code als Zeichenfolge und wertet ihn aus / führt ihn aus.

eval(inputString);
Kasthuri
quelle
Jeder Aufruf von eval () erstellt eine neue Instanz des JavaScript-Interpreters. Dies kann ein Ressourcenfresser sein.
Yëco