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?


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;

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

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

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)

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.


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

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.