SyntaxError: Unerwartetes Token o in JSON an Position 1


138

Ich analysiere nur wenige Daten mithilfe einer Typklasse in meinem Controller. Ich erhalte Daten wie folgt:

{  
   "data":{  
      "userList":[  
         {  
            "id":1,
            "name":"soni"
         }
      ]
   },
   "status":200,
   "config":{  
      "method":"POST",
      "transformRequest":[  
         null
      ],
      "transformResponse":[  
         null
      ],
      "url":"/home/main/module/userlist",
      "headers":{  
         "rt":"ajax",
         "Tenant":"Id:null",
         "Access-Handler":"Authorization:null",
         "Accept":"application/json, text/plain, */*"
      }
   },
   "statusText":"OK"
}

Ich habe versucht, die Daten so zu speichern

var userData = _data;
var newData = JSON.parse(userData).data.userList;

Wie kann ich die Benutzerliste in eine neue Variable extrahieren?


11
Sie müssen möglicherweise nicht verwenden JSON.parse. Versuchen Sie es userDatadirekt als Objekt.
Mohit Bhardwaj

13
Wenn console.log(typeof userData)angezeigt objectwird, haben Sie bereits ein Javascript-Objekt und keine JSON-Zeichenfolge, die Sie analysieren müssen.
t.niese

1
@MohitBhardwaj ja, muss nicht für die
Analyse

5
Wenn Sie diesen Fehler erhalten Unexpected token o in JSON, versuchen Sie normalerweise , ein Objekt zu analysieren, das bereits in analysierter Form vorliegt.
Mohit Bhardwaj

@MohitBhardwaj okay!
Soniya Mohan

Antworten:


188

Der von Ihnen gepostete JSON sieht gut aus, in Ihrem Code handelt es sich jedoch höchstwahrscheinlich nicht mehr um eine JSON-Zeichenfolge, sondern bereits um ein JavaScript-Objekt. Dies bedeutet, dass kein Parsen mehr erforderlich ist.

Sie können dies selbst testen, z. B. in der Chrome-Konsole:

new Object().toString()
// "[object Object]"

JSON.parse(new Object())
// Uncaught SyntaxError: Unexpected token o in JSON at position 1

JSON.parse("[object Object]")
// Uncaught SyntaxError: Unexpected token o in JSON at position 1

JSON.parse()konvertiert die Eingabe in eine Zeichenfolge. Die toString()Methode von JavaScript-Objekten wird standardmäßig zurückgegeben [object Object], was zu dem beobachteten Verhalten führt.

Versuchen Sie stattdessen Folgendes:

var newData = userData.data.userList;

1
Ist dies also für alle Arten von Browsern anwendbar?
ComeOnGetIt

@ Timo Könnten Sie diesen Link suchen.
V SH

Manchmal kann dieser Fehler auftreten, wenn der API-URL-Endpunkt, der die Anforderung bedient, einen Fehler im Code oder in einer anderen enthaltenen oder verwendeten Datei aufweist und einen Fehler auslöst, der nicht behandelt oder notiert wird. Meistens können Sie dies erhalten, wenn Sie sich die Registerkarte "Netzwerk" in den Browser-Entwicklertools ansehen oder den Endpunkt mit "Post Man" erreichen und sehen, was auf Sie zukommt.
MuturiAlex

64

Die ersten Funktionsparameter JSON.parsesollten ein String sein, und Ihre Daten sind ein JavaScript-Objekt. Sie werden daher in einen String konvertiert [object object], den Sie JSON.stringifyvor dem Übergeben der Daten verwenden sollten

JSON.parse(JSON.stringify(userData))

1
Großartig geholfen, Bruder. Danke :)
Anand_5050

Es hat geholfen. Danke für die Lösung.
Nag Arjun

Du hast meinen Tag gerettet, Bruder. Danke :)
Dwarkesh Soni

Dies funktioniert nicht, wenn die Zeichenfolge ein doppeltes Anführungszeichen enthält. Haben Sie eine Lösung
Mr S Coder

21

Verwenden Sie es niemals, JSON.parseohne es in einen try-catchBlock zu wickeln :

// payload 
let userData = null;

try {
    userDate = JSON.parse(payload); 
} catch (e) {
    // You can read e for more info
    // Let's assume the error is that we already have parsed the payload
    // So just return that
    userData = payload;
}

// Now userData is the parsed result

7
Dies beantwortet die Frage nicht wirklich, sondern kommentiert das Fehlen einer Ausnahmebehandlung.
Richard Duerr

1
@RichardDuerr, aber dies hilft, Fehler des Hauptthemas zu beheben. dh SyntaxError: Unerwartetes Token o in JSON an Position 1
Niko Jojo

6
Das verbirgt den Fehler nur, löst ihn aber nicht wirklich.
Richard Duerr

21

Nur oben JSON.parse, zu verwenden:

var newData = JSON.stringify(userData)

4
JSON.stringify()konvertiert ein JavaScript-Objekt in eine Zeichenfolgendarstellung, was das Gegenteil von dem ist, was es JSON.parse()tut. Sie haben das bekommen, SyntaxErrorweil Sie versucht haben, etwas zu analysieren, das bereits ein Objekt war. In der Lösung von @ Sukhchain wird es in eine Zeichenfolge konvertiert, um dies zu vermeiden.
Hubert

1
Der Nachteil dabei ist, dass Sie am Ende JSON.parse()zu viel redundant verwenden. Obwohl es ein ziemlich schneller Prozess ist, erfolgt das Parsen von JSON synchron und kann möglicherweise Ihre Benutzeroberfläche blockieren. Ich würde daher davon abraten, dies zu verwenden. Stattdessen können Sie überprüfen, ob Ihre Variable ein Objekt ist, z. B. mithilfe von, typeof(userData) === 'object'bevor Sie versuchen, sie zu analysieren.
Hubert

2

Nun, ich meinte, dass ich ein Objekt wie folgt analysieren muss : var jsonObj = {"first name" : "fname"}. Aber das tue ich eigentlich nicht. Weil es schon ein JSON ist.


1

Der unerwartete 'O'-Fehler wird ausgelöst, wenn JSON-Daten oder -Strings analysiert werden.

Wenn es ein String ist, ist er bereits stringfied. Das Parsen endet mit einem unerwarteten O-Fehler.

Ich sah mich ähnlich (obwohl in einem anderen Kontext), ich löste den folgenden Fehler durch Entfernen von JSON Producer.

    @POST
    @Produces({ **MediaType.APPLICATION_JSON**})
    public Response login(@QueryParam("agentID") String agentID , Officer aOffcr ) {
      return Response.status(200).entity("OK").build();

  }

Die Antwort enthält die Zeichenfolgenrückgabe "OK" . Die als @Produces ({** MediaType.APPLICATION_JSON }) ** gekennzeichnete Anmerkung versucht, die Zeichenfolge im JSON-Format zu analysieren, was zu einem unerwarteten 'O' führt. .

Das Entfernen von @Produces ({ MediaType.APPLICATION_JSON }) funktioniert einwandfrei . Ausgabe: OK

Achtung: Wenn Sie auf Client-Seite eine Ajax-Anfrage stellen und JSON.parse ("OK") verwenden, wird das unerwartete Token 'O' ausgegeben.

O ist der erste Buchstabe der Zeichenfolge

JSON.parse (Objekt) vergleicht mit jQuery.parseJSON (Objekt);

JSON.parse ('{"name": "Yergalem", "city": "Dover"}'); --- Funktioniert gut


1

Wir können auch Schecks wie diesen hinzufügen:

function parseData(data) {
    if (!data) return {};
    if (typeof data === 'object') return data;
    if (typeof data === 'string') return JSON.parse(data);

    return {};
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.