nieprzechwycona składnia nieoczekiwany token U JSON


293

Otrzymuję ten błąd „nieprzechwycona składnia lub nieoczekiwany token U”, gdy uruchamiam stronę w chrome. A w Firefoksie pojawia się „JSON.parse: nieoczekiwany znak”. Zwracam dane json z pliku php, a zwracany ciąg json jest prawidłowy. Sprawdziłem to na http://jsonlint.com/ . Każda pomoc będzie mile widziana ... Dzięki.

Oto zwrócony ciąg JSON

[
    ["1","Pan Africa Market","\"1521 1st Ave, Seattle, WA\"","47.608941","-122.340145","restaurant"],
    ["2","The Melting Pot","14 Mercer St, Seattle, WA","47.624562","-122.356442","restaurant"],
    ["3","Ipanema Grill","1225 1st Ave, Seattle, WA","47.606366","-122.337656","restaurant"],
    ["4","Sake House","230 1st Ave, Seattle, WA","47.612825","-122.34567","bar"],
    ["5","Crab Pot","1301 Alaskan Way, Seattle, WA","47.605961","-122.34036","restaurant"],
    ["6","Mexican Kitchen","2234 2nd Ave, Seattle,WA","47.613975","-122.345467","bar"],
    ["7","Wingdome","1416 E Olive Way, Seattle, WA","47.617215","-122.326584","bar"],
    ["8","Piroshky Piroshky","1908 Pike pl, Seattle, WA","47.610127","-122.342838","restaurant"]
]

Czy możesz opublikować JSON? Kiedy dostaję ten błąd, zwykle oznacza to, że istnieje nie kończący się ciąg - oznacza to, że znajduje się on na literze „U” w JSON.
— Kyle Burton

Może to być dziwny problem z \"wyjściem.
— Felix Kling

JSON analizuje dobrze. Powinieneś spróbować dowiedzieć się, na czym tak naprawdę dusi się Twój kod.
— nneonneo

Odpowiedzi:


646

Ten błąd jest zwykle widziany, gdy podana wartość JSON.parseto faktycznie undefined. Sprawdziłbym więc kod, który próbuje to przeanalizować - najprawdopodobniej nie analizujesz pokazanego tutaj łańcucha.


27
Może być również "undefined"jako ciąg zamiast literału undefined. Właśnie spędziłem 30 minut, żeby się tego dowiedzieć.
— ug_

13
@ ns47731 To jest właściwie to samo. Powodem, dla którego staje się faktyczna niezdefiniowana u, jest to, że undefinedjest ona wymuszana na ciąg (ponieważ ciąg jest tym, czego oczekuje JSON.parse).
— Sean Kinsey

10
Ugh, wysyłał asynchroniczne żądanie i natychmiast próbował przeanalizować niezdefiniowany zwrot. Zniesmaczony sobą, dzięki.
— Chris Trudeau

7
Ten błąd zostałby również wyrzucony przez UTF-8 {"na początku łańcucha json
— metamagikum 10'15

1
Mój błąd polegał na Unexpected token N in JSON at position...tym, że problemem była doublewartość:NaN
— Jaider

14

Otrzymałem ten komunikat podczas sprawdzania poprawności (w projekcie MVC). Dla mnie dodanie ValidationMessageFor elementu rozwiązało problem.

Mówiąc ściślej, przyczyną problemu był wiersz nr 43 w pliku jquery.validate.unobtrusive.js:

  replace = $.parseJSON(container.attr("data-valmsg-replace")) !== false;

To sprawiło, że znalazłem się na właściwej drodze; w moim przypadku robiłem, $("form :input").valid();aby uruchomić sprawdzanie poprawności. Ale najwyraźniej wystąpił błąd na ukrytym polu bez ValidationMessageFor. Naprawiono poprzez zmianę na$("form :input:visible").valid();
— Trax72

7

Parametr dla JSON.parse może nie zwracać niczego (tzn. Wartość podana dla JSON.parse to undefined)!

Zdarzyło mi się to podczas analizowania skompilowanego kodu solidności z pliku xyz.sol.

import web3 from './web3';
import xyz from './build/xyz.json';

const i = new web3.eth.Contract(
  JSON.parse(xyz.interface),
  '0x99Fd6eFd4257645a34093E657f69150FEFf7CdF5'
);

export default i;

który został błędnie napisany jako

JSON.parse(xyz.intereface)

który nic nie zwracał!


5

Najczęstszym przypadkiem tego błędu jest użycie szablonu, który generuje formant, a następnie zmienia sposób idi / lub namesą generowane przez „zastąpienie” domyślnego szablonu czymś w rodzaju

@Html.TextBoxFor(m => m, new {Name = ViewData["Name"], id = ViewData["UniqueId"]} )

a następnie zapominając o zmianie ValidationMessageForna

@Html.ValidationMessageFor(m => m, null, new { data_valmsg_for = ViewData["Name"] })    

Mam nadzieję, że zaoszczędzi ci to trochę czasu.


3

Wystąpił ten błąd, gdy uruchomiłem warunek znajdowania na tablicy JSONArray w pętli for. Problem, z którym się spotkałem, był wynikiem jednej z wartości w pętli for zwracającej wartość null. Dlatego gdy próbowałem uzyskać dostęp do nieruchomości, nie udało się.

Więc jeśli robisz coś w obrębie JSONArrays, gdzie nie jesteś pewien źródła danych i jego integralności, uważam, że dobrym zwyczajem jest radzenie sobie z zerowymi i nieokreślonymi wyjątkami w tym przypadku.

Naprawiłem to, sprawdzając wartość NULL na zwracanej wartości find na JSONArray i odpowiednio obsługując wyjątki.

Pomyślałem, że to może pomóc.


1

W moim przypadku próbowano wywołać JSON.parse () na zmiennej AJAX przed powrotem XHRResponse. NA PRZYKŁAD:

var response = $.get(URL that returns a valid JSON string);
var data = JSON.parse(response.responseText);

Zamieniłem to na przykład z witryny jQuery dla $ .get :

<script type="text/javascript"> 
    var jqxhr = $.get( "https://jira.atlassian.com/rest/api/2/project", function() {
          alert( "success" );
        })
          .done(function() {
//insert code to assign the projects from Jira to a div.
                jqxhr = jqxhr.responseJSON;
                console.log(jqxhr);
                var div = document.getElementById("products");
                for (i = 0; i < jqxhr.length; i++) {
                    console.log(jqxhr[i].name);
                    div.innerHTML += "<b>Product: " + jqxhr[i].name + "</b><BR/>Key: " + jqxhr[i].key + "<BR/>";
                }
                console.log(div);
            alert( "second success" );
          })
          .fail(function() {
            alert( "error" );
          })
          .always(function() {
            alert( "finished" );
          });

        // Perform other work here ...

        // Set another completion function for the request above
        jqxhr.always(function() {
          alert( "second finished" );
        });
</script>

1

Po prostu nie rozumiem

np. to powiedzmy, że mam JSON STRING .. NIE JESZCZE OBIEKT JSON LUB ARRAY.

więc jeśli w javascript przetworzysz ciąg jako

var body={
  "id": 1,
  "deleted_at": null,
  "open_order": {
    "id": 16,
    "status": "open"}

var jsonBody = JSON.parse(body.open_order); //HERE THE ERROR NOW APPEARS BECAUSE THE STRING IS NOT A JSON OBJECT YET!!!! 
//TODO SO
var jsonBody=JSON.parse(body)//PASS THE BODY FIRST THEN LATER USE THE jsonBody to get the open_order

var OpenOrder=jsonBody.open_order;

Świetne odpowiedzi powyżej


1

Ta odpowiedź jest przeznaczona dla osób, które napotykają ten błąd podczas pracy z przesyłaniem plików .

Używaliśmy oprogramowania pośredniego do szyfrowania opartego na tokenach - deszyfrowania i napotkaliśmy ten sam błąd.

Oto nasz kod w pliku trasy:

  router.route("/uploadVideoMessage")
  .post(
    middleware.checkToken,
    upload.single("video_file"),
    videoMessageController.uploadVideoMessage
  );

tutaj nazywaliśmy oprogramowanie pośrednie przed funkcją przesyłania, co powodowało błąd. Więc kiedy zmieniliśmy to na to, zadziałało.

router.route("/uploadVideoMessage")
  .post(
    upload.single("video_file"),
    middleware.checkToken,
    videoMessageController.uploadVideoMessage
  );

0

To nie jest trudne zadanie. Ten problem występuje również na mojej stronie, powinieneś przesunąć swoje pliki js najwyżej uporządkowane. Ponieważ w miejscu, w którym używasz parsowania JSON, tym razem twoje pliki JS nie są ładowane. PRZYKŁAD #

<script type="text/javaScript">
...........SOME CODE.............
</script>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>

zmień na

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script type="text/javaScript">
...........SOME CODE.............
</script>

0

Cóż, dla wszystkich, którzy tak naprawdę nie mogą znaleźć błędu w żadnym miejscu w kodzie, ani „niezdefiniowany, jak mówi w lokalnej pamięci, ani null” ... po prostu skomentuj swój kod i napisz inny, który faktycznie usuwa element w lokalnej pamięci. . następnie możesz skomentować lub usunąć bieżący kod i zresetować poprzedni, po prostu usuwając komentarz (jeśli nie usuniesz t ... jeśli możesz, możesz go napisać :))

LocalStorage.setItem('Previous' , "removeprevious");  


LocalStorage.removeItem('Previous');   
 Console.log(LocalStorage.getItem('Previous'));

Konsola wyświetli wartość null i zresetuje kod ponownie, jeśli t nie działa, koleś! Masz błędy.

przepraszam za mój angielski!


-3

Pojawił się ten błąd, gdy używałem tej samej zmiennej dla łańcucha json i analizowałem plik json:

var json = '{"1":{"url":"somesite1","poster":"1.png","title":"site title"},"2":{"url":"somesite2","poster":"2.jpg","title":"site 2 title"}}'

function usingjson(){
    var json = JSON.parse(json);
}

Zmieniłem funkcję na:

function usingjson(){
    var j = JSON.parse(json);
}

Teraz ten błąd zniknął.

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.