it-swarm.com.de

Nicht abgeholter SyntaxError: Unerwartetes Token mit JSON.parse

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

142
coiso

products ist ein Objekt. (aus einem Objektliteral erstellen)

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

Ihr Code wandelt das Objekt in einen String um (indem Sie .toString() aufrufen), um es als JSON-Text zu analysieren.
.__ Die Standardeinstellung .toString() gibt "[object Object]" zurück, der kein gültiger JSON ist. daher der fehler.

185
SLaks

Nehmen wir an, Sie wissen, dass es gültige JSON ist, aber Sie erhalten dies immer noch ... 

In diesem Fall ist es wahrscheinlich, dass die Zeichenfolge aus der Quelle, in der Sie sie erhalten, ausgeblendete Sonderzeichen enthält. Beim Einfügen in einen Prüfer gehen sie verloren - in der Zeichenfolge sind sie jedoch noch vorhanden. Diese Zeichen werden zwar unsichtbar, brechen jedoch JSON.parse()

Wenn s Ihr Roh-JSON ist, dann bereinigen Sie es 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);
82
EdH

Es scheint, dass Sie stringify das Objekt wollen. Also mach das: 

JSON.stringify(products);

Der Grund für den Fehler ist, dass JSON.parse() einen String-Wert erwartet und products eine Array ist.

Anmerkung: Ich denke, es versucht json.parse('[object Array]'), die sich darüber beschwert, dass das Token o nach [ nicht erwartet wurde.

54

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

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

Ich habe die typeof(inputString) ausgedruckt - es war ein String, der Fehler tritt jedoch immer noch auf.

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

Später stellte ich fest, dass dies ein Problem mit dem neuen Zeilenoperator [\n] in einem Feldwert war.

Ich habe ein ersetzt [mit einem anderen Zeichen, setze die neue Zeile nach der Analyse zurück] und alles funktioniert gut.

26
Derin
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"}]';
10
pktangyue

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
7
Térence
[
  {
    "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.

3
San

Hier ist eine Funktion, die ich basierend auf früheren Antworten erstellt habe: Sie funktioniert auf meiner Maschine, aber 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
              //https://stackoverflow.com/questions/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;
            }
2
tmurphree

Achten Sie bei der Verwendung der POST - oder PUT-Methode darauf, den Body-Teil zu stringifizieren.

Ich habe hier ein Beispiel dokumentiert https://Gist.github.com/manju16832003/4a92a2be693a8fda7ca84b58b8fa7154

2
Manjunath Reddy

Ein weiterer Unterschied, der zur "SyntaxError: Unexpected token"-Ausnahme führen kann, wenn JSON.parse() aufgerufen wird, verwendet eine der folgenden Werten in den String-Werten:

  1. Zeichen mit neuen Zeilen.

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

  3. Jeder Stand-Alone-Schrägstrich \ (aber aus irgendeinem Grund nicht /, zumindest nicht in 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"
    }
}

Es sollte also geändert werden in:

{
    "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 ich also sagen sollte, macht es im reinen JSON-Format mit größerer Textmenge ziemlich unlesbar.

1
c00000fd

Sie müssen einen gültigen Json-String unter https://jsonformatter.curiousconcept.com/ eingeben.

gültiger Json-String muss ein doppeltes Anführungszeichen enthalten.

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

kein Zitat verursacht Fehler

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

einfaches Anführungszeichen verursacht Fehler

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

Der einzige Fehler, den Sie dabei machen, ist, dass Sie bereits geparste Objekte analysieren.

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

1
Kiran Maniya

Hoffentlich hilft das jemand anderem.

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

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

1
Chris

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]);
0
ic3b3rg

Dies kann aus einer Reihe von Gründen geschehen, aber wahrscheinlich für ein ungültiges Zeichen. Sie können also JSON.stringify(obj); verwenden, um Ihr Objekt in eine JSON-Datei umzuwandeln. Denken Sie jedoch daran, dass es sich um einen JQUERY-Ausdruck handelt. 

0

Warum brauchst du JSON.parse? Es befindet sich bereits im Array des Objektformats.

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

Das kann dir helfen.

0
abhijit padhy

Anscheinend sind \r, \b, \t, \f usw. nicht die einzigen problematischen Zeichen, die zu diesem Fehler führen können.

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

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 von Chrome sehe ich, dass JSON.parse(String.fromCharCode(0x22, x, 0x22)); nicht zulässig ist, wobei x 34, 92 oder von 0 bis 31 ist. 

Die Zeichen 34 und 92 sind die "- bzw. \-Zeichen. Sie werden normalerweise erwartet und ordnungsgemäß mit Escapezeichen versehen. Es sind die Zeichen 0 bis 31, die Ihnen Probleme bereiten würden.

Stellen Sie vor dem Ausführen von JSON.parse(input) sicher, dass die Eingabe keine problematischen Zeichen enthält, um beim Debuggen zu helfen:

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;
        }
    }
}
0
Pacerier

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 ein HTML zurück, wenn der PHP-Code fehlschlägt).

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

0
Ari Waisberg

Der Fehler, den Sie erhalten, d. H. "Unerwartetes Token o", ist darauf zurückzuführen, dass Json erwartet wird, das Objekt jedoch während der Analyse abgerufen wird. Dieses "o" ist der erste Buchstabe von Word "Objekt".

0
Shashank Bodkhe

Wenn führende oder nachgestellte Leerzeichen vorhanden sind, sind sie ungültig . Nachgestellte/führende Leerzeichen können als entfernt werden

mystring = mystring.replace(/^\s+|\s+$/g, "");

Quelle: http://www.toptip.ca/2010/02/javascript-trim-leading-or-trailing.html

0
att

Oh Mann, die Lösungen in allen obigen Antworten haben für mich nicht funktioniert. Ich hatte gerade ein ähnliches Problem. Ich habe es geschafft, es mit dem Zitat zu lösen. Siehe den Screenshot. Whoo.

 enter image description here

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

0
Well Smith