SyntaxError: jeton inattendu o dans JSON à la position 1

139

J'analyse quelques données en utilisant une classe de type dans mon contrôleur.J'obtiens des données comme suit:

{  
   "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"
}

J'ai essayé de stocker les données comme ça

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

Comment extraire la liste des utilisateurs vers une nouvelle variable?

Soniya Mohan
la source
11
Vous n'aurez peut-être pas besoin de l'utiliser JSON.parse. Essayez de l'utiliser userDatadirectement comme objet.
Mohit Bhardwaj
13
Si console.log(typeof userData)s'affiche, objectvous avez déjà un objet javascript et non une chaîne JSON que vous devez analyser.
t.niese le
1
@MohitBhardwaj oui, n'est pas nécessaire pour l'analyse ..
Soniya Mohan
5
Habituellement, chaque fois que vous obtenez cette erreur Unexpected token o in JSON, vous essayez probablement d'analyser un objet qui est déjà sous forme analysée.
Mohit Bhardwaj
@MohitBhardwaj d'accord!
Soniya Mohan

Réponses:

191

Le JSON que vous avez publié semble correct, mais dans votre code, il ne s'agit probablement plus d'une chaîne JSON, mais déjà d'un objet JavaScript. Cela signifie qu'aucune analyse n'est nécessaire.

Vous pouvez le tester vous-même, par exemple dans la console de Chrome:

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()convertit l'entrée en une chaîne. La toString()méthode des objets JavaScript par défaut retourne [object Object], ce qui entraîne le comportement observé.

Essayez plutôt ce qui suit:

var newData = userData.data.userList;
Timo
la source
1
Cela s'applique-t-il donc à tous les types de navigateurs?
comeOnGetIt
@Timo Pourriez-vous regarder ce lien.
V SH du
Parfois, cette erreur peut apparaître lorsque le point de terminaison d'URL d'API qui sert la demande a une erreur dans son code ou dans un autre fichier inclus ou utilisé et génère une erreur qui n'est pas gérée ou notée. La plupart du temps, vous pouvez l'obtenir si vous regardez l'onglet réseau dans les outils de développement du navigateur ou si vous pouvez atteindre le point de terminaison en utilisant post man et voir ce qui se passe.
MuturiAlex
65

les premiers paramètres de la fonction JSON.parsedoivent être une chaîne et vos données sont un objet JavaScript, elles seront donc converties en chaîne [object object], vous devez utiliser JSON.stringifyavant de transmettre les données

JSON.parse(JSON.stringify(userData))
huruji
la source
1
Grand frère aidé. Thanks :)
Anand_5050
Cela a aidé, merci pour la solution.
Nag Arjun le
Tu as sauvé ma journée mon frère. Merci :)
Dwarkesh Soni
cela ne fonctionnera pas lorsque la chaîne contient un guillemet double avez-vous une solution
Mr S Coder
23

Ne l'utilisez jamais JSON.parsesans l'envelopper dans un try-catchbloc:

// payload 
let userData = null;

try {
    // Parse a JSON
    userData = 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
la source
7
Cela ne répond pas réellement à la question, mais commente le manque de gestion des exceptions.
Richard Duerr
2
@RichardDuerr, mais cela aidera à corriger l'erreur du sujet principal. ie SyntaxError: jeton inattendu o dans JSON à la position 1
Niko Jojo
6
Cela masque simplement l'erreur, mais ne la résout pas réellement.
Richard Duerr
21

Juste au dessus JSON.parse, utilisez:

var newData = JSON.stringify(userData)
Sukhchain
la source
4
JSON.stringify()convertit un objet JavaScript en une représentation sous forme de chaîne, ce qui est le contraire de ce que JSON.parse()fait. Vous obteniez le SyntaxErrorparce que vous essayiez d'analyser quelque chose qui était déjà un objet. Dans la solution de @ Sukhchain, il est converti en une chaîne pour éviter cela.
Hubert
1
L'inconvénient est qu'en fin de compte, vous en utilisez JSON.parse()trop de manière redondante. Même s'il s'agit d'un processus assez rapide, l'analyse de JSON est effectuée de manière synchrone et peut potentiellement bloquer votre interface utilisateur, je vous déconseille donc de l'utiliser. Au lieu de cela, vous pouvez vérifier si votre variable est un objet, par exemple en utilisant typeof(userData) === 'object'avant d'essayer de l'analyser.
Hubert
2

Eh bien, je voulais dire que je dois analyser objet comme ceci: var jsonObj = {"first name" : "fname"}. Mais je ne le fais pas vraiment. Parce que c'est déjà un JSON.

М.Б.
la source
2

Nous pouvons également ajouter des vérifications comme ceci:

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

    return {};
}
Pulkit chadha
la source
1

Une erreur 'O' inattendue est générée lorsque des données JSON ou une chaîne sont analysées.

Si c'est une chaîne, c'est déjà une chaîne. L'analyse se termine par une erreur «O» inattendue.

J'ai fait face à la même chose (bien que dans un contexte différent), j'ai résolu l'erreur suivante en supprimant JSON Producer.

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

  }

La réponse contient un retour de chaîne "OK" . L'annotation marquée @Produces ({** MediaType.APPLICATION_JSON }) ** essaie d'analyser la chaîne au format JSON, ce qui entraîne un «O» inattendu .

La suppression de @Produces ({ MediaType.APPLICATION_JSON }) fonctionne correctement . Sortie: OK

Attention: également, côté client, si vous effectuez une requête ajax et utilisez JSON.parse ("OK"), il jette un jeton inattendu 'O'

O est la première lettre de la chaîne

JSON.parse (objet) se compare à jQuery.parseJSON (objet);

JSON.parse ('{"nom": "Yergalem", "ville": "Douvres"}'); --- Fonctionne bien

Yergalem
la source