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"]
]
kinath_ru
źródło
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.

Sean Kinsey
źródło
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;
użytkownik1412699
źródło
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ł!

Kartik ganiga
źródło
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.

Matas Vaitkevicius
źródło
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.

SD1985
źródło
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>
delliottg
źródło
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

Dobre życie
źródło
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
  );
Kushal Parikh
źródło
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>
mk Mughal
źródło
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!

Nancy256
źródło
-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ął.

użytkownik2605603
źródło