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?

Soniya Mohan
quelle
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;
Timo
quelle
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))
Huruji
quelle
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
Kousha
quelle
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)
Sukhchain
quelle
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.

М.Б.
quelle
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

Yergalem
quelle
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 {};
}
Pulkit Chadha
quelle