SyntaxError: Nieoczekiwany token o w formacie JSON na pozycji 1

138

Parsuję kilka danych za pomocą klasy typu w moim kontrolerze. Otrzymuję dane w następujący sposób:

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

Próbowałem przechowywać dane w ten sposób

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

Jak wyodrębnić listę użytkowników do nowej zmiennej?

Soniya Mohan
źródło
11
Możesz nie potrzebować JSON.parse. Spróbuj użyć userDatabezpośrednio jako obiektu.
Mohit Bhardwaj,
13
Jeśli console.log(typeof userData)wyświetli się, objectmasz już obiekt javascript, a nie ciąg JSON, który musisz przeanalizować.
t.niese
1
@MohitBhardwaj tak, nie jest wymagane do parsowania ..
Soniya Mohan
5
Zwykle za każdym razem, gdy Unexpected token o in JSONpojawia się ten błąd - najprawdopodobniej próbujesz przeanalizować obiekt, który jest już w sparsowanej formie.
Mohit Bhardwaj
@MohitBhardwaj okay!
Soniya Mohan

Odpowiedzi:

190

Opublikowany przez Ciebie kod JSON wygląda dobrze, jednak w Twoim kodzie najprawdopodobniej nie jest to już ciąg JSON, ale już obiekt JavaScript. Oznacza to, że nie jest konieczne dalsze analizowanie.

Możesz to sprawdzić samodzielnie, np. W konsoli 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()konwertuje dane wejściowe na ciąg. toString()Metoda JavaScript obiektów domyślnie powrotów [object Object], w wyniku obserwowanego zachowania.

Zamiast tego spróbuj wykonać następujące czynności:

var newData = userData.data.userList;
Timo
źródło
1
Czy to dotyczy wszystkich rodzajów przeglądarek?
comeOnGetIt
@Timo Czy możesz spojrzeć na ten link.
V SH
Czasami ten błąd może pojawić się, gdy punkt końcowy adresu URL interfejsu API, który obsługuje żądanie, zawiera błąd w swoim kodzie lub innym dołączonym lub używanym pliku i zgłasza błąd, który nie jest obsługiwany ani odnotowywany. Przeważnie można to uzyskać, patrząc na kartę sieciową w narzędziach programistycznych przeglądarki lub możesz trafić do punktu końcowego za pomocą post man i zobaczyć, co się pojawi.
MuturiAlex
65

pierwsze parametry funkcji JSON.parsepowinny być typu String, a Twoje dane to obiekt JavaScript, więc zostaną przekonwertowane na String [object object], którego należy użyć JSON.stringifyprzed przekazaniem danych

JSON.parse(JSON.stringify(userData))
huruji
źródło
1
Bardzo pomogłem bracie. Dzięki :)
Anand_5050
Pomogło, dzięki za rozwiązanie.
Nag Arjun
Uratowałeś mój dzień bracie. Dzięki :)
Dwarkesh Soni
to nie zadziała, gdy ciąg zawiera podwójny cudzysłów. Czy masz jakieś rozwiązanie
Mr S Coder,
23

Nigdy nie używaj JSON.parsebez zawijania go w try-catchblok:

// 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
źródło
7
To właściwie nie odpowiada na pytanie, ale komentuje brak obsługi wyjątków.
Richard Duerr
2
@RichardDuerr, ale pomoże to naprawić błąd głównego tematu. tj. SyntaxError: Nieoczekiwany token o w JSON na pozycji 1
Niko Jojo
6
To tylko ukrywa błąd, ale w rzeczywistości go nie rozwiązuje.
Richard Duerr
21

Tuż powyżej JSON.parseużyj:

var newData = JSON.stringify(userData)
Sukhchain
źródło
4
JSON.stringify()konwertuje obiekt JavaScript na jego reprezentację w postaci łańcucha, co jest przeciwieństwem tego, co JSON.parse()robi. Otrzymałeś, SyntaxErrorponieważ próbowałeś przeanalizować coś, co już było obiektem. W rozwiązaniu @ Sukhchain jest konwertowany na łańcuch, aby tego uniknąć.
Hubert
1
Wadą tego jest to, że w końcu używasz JSON.parse()zbyt dużo nadmiaru. Mimo że jest to dość szybki proces, analizowanie JSON odbywa się synchronicznie i może potencjalnie blokować interfejs użytkownika, więc odradzałbym używanie tego. Zamiast tego możesz sprawdzić, czy zmienna jest obiektem, na przykład używając typeof(userData) === 'object'przed próbą jej przeanalizowania.
Hubert
2

Cóż, miałem na myśli, że muszę analizować obiekt tak: var jsonObj = {"first name" : "fname"}. Ale tak naprawdę nie mam. Ponieważ jest to już JSON.

М.Б.
źródło
2

Możemy również dodać takie kontrole:

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

    return {};
}
Pulkit chadha
źródło
1

Nieoczekiwany błąd „O” jest generowany, gdy dane JSON lub String są analizowane.

Jeśli jest to string, to jest już stringfied. Parsowanie kończy się nieoczekiwanym błędem „O”.

Napotkałem podobny (choć w innym kontekście), rozwiązałem następujący błąd, usuwając JSON Producer.

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

  }

Odpowiedź zawiera zwrotny ciąg znaków „OK” . Adnotacja oznaczona jako @Produces ({** MediaType.APPLICATION_JSON }) ** próbuje przeanalizować ciąg do formatu JSON, co skutkuje nieoczekiwanym „O” .

Usunięcie @Produces ({ MediaType.APPLICATION_JSON }) działa dobrze. Wyjście: OK

Uwaga: po stronie klienta, jeśli wyślesz żądanie Ajax i użyjesz JSON.parse („OK”), wyrzuci nieoczekiwany token „O”

O to pierwsza litera ciągu

JSON.parse (obiekt) porównuje z jQuery.parseJSON (obiekt);

JSON.parse ('{"name": "Yergalem", "city": "Dover"}'); --- Działa w porządku

Yergalem
źródło