sintaxis sin capturar token inesperado U JSON


294

Recibo este error "sintaxis inesperada token U inesperado" cuando ejecuto mi página en Chrome. Y en firefox me sale, "JSON.parse: carácter inesperado". Estoy devolviendo los datos json de un archivo php y la cadena json devuelta es válida. Lo revisé con http://jsonlint.com/ . Cualquier ayuda será apreciada, gracias.

Aquí está la cadena JSON devuelta

[
    ["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"]
]

¿Puedes publicar el JSON? Cuando recibo ese error, generalmente me informa que hay una cadena sin terminar, indica que está en la letra 'U' en el JSON.
Kyle Burton

Podría haber algún problema extraño con el \"en la salida.
Felix Kling

Ese JSON analiza bien. Deberías tratar de descubrir en qué se está ahogando tu código.
nneonneo

Respuestas:


647

Ese error se ve normalmente cuando el valor dado a JSON.parsees en realidad undefined. Entonces, verificaría el código que está tratando de analizar esto, lo más probable es que no esté analizando la cadena real que se muestra aquí.


27
También podría ser "undefined"como una cadena en lugar del literal undefined. Acabo de pasar 30 minutos descubriendo eso.
ug_

13
@ ns47731 Eso es realmente lo mismo. La razón por la que se convierte en un indefinido real ues que undefinedse convierte en una cadena (porque una cadena es lo que JSON.parse espera).
Sean Kinsey

10
Ugh, estaba enviando una solicitud asincrónica e inmediatamente tratando de analizar el retorno indefinido. Disgustado conmigo mismo, gracias.
Chris Trudeau

77
Este error también se lanzaría a través de un UTF-8 {"al comienzo de la cadena json
metamagikum

1
Mi error fue Unexpected token N in JSON at position...y el problema fue un doublevalor:NaN
Jaider

14

Recibí este mensaje mientras validaba (en el proyecto MVC). Para mí, agregar el elemento ValidationMessageFor solucionó el problema.

Para ser precisos, la línea número 43 en jquery.validate.unobtrusive.js causó el problema:

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

Esto me llevó por el buen camino; en mi caso estaba haciendo $("form :input").valid();para activar la validación. Pero aparentemente recibió un error en un campo oculto sin ValidationMessageFor. Solucionado cambiando a$("form :input:visible").valid();
Trax72

7

¡El parámetro para JSON.parse puede no devolver nada (es decir, el valor dado para JSON.parse es undefined)!

Me sucedió mientras analizaba el código de solidez Compilado de un archivo 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;

que estaba mal escrito como

JSON.parse(xyz.intereface)

que no devolvía nada!


5

El caso más común de que ocurra este error es usar una plantilla que genera el control y luego cambia la forma idy / o namese genera al 'anular' la plantilla predeterminada con algo como

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

y luego olvidando cambiar ValidationMessageFora

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

Espero que esto te ahorre algo de tiempo.


3

Experimenté este error cuando ejecuté una condición de búsqueda en un JSONArray dentro de un bucle for. El problema que enfrenté fue el resultado de que uno de los valores en el bucle for devuelve nulo. Por lo tanto, cuando intenté acceder a una propiedad que falló.

Entonces, si está haciendo algo dentro de JSONArrays donde no está seguro de la fuente de datos y su integridad, creo que es un buen hábito tratar con excepciones nulas e indefinidas en este caso.

Lo arreglé comprobando si el valor devuelto de find en el JSONArray era nulo y manejando las excepciones de manera adecuada.

Pensé que esto podría ayudar.


1

En mi caso, estaba tratando de llamar a JSON.parse () en una variable AJAX antes de que XHRResponse volviera. P.EJ:

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

Reemplacé eso con un ejemplo del sitio jQuery por $ .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

Solo en caso de que no entendieras

por ejemplo, digamos que tengo una JSON STRING ... NO ES UN OBJETO O ARRAY JSON.

así que si en JavaScript analiza la cadena como

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;

Grandes respuestas arriba


1

Esta respuesta es para las personas que enfrentan este error mientras trabajan con File Upload .

Estábamos usando middleware para el cifrado basado en tokens - descifrado y encontramos el mismo error.

El siguiente fue nuestro código en el archivo de ruta:

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

aquí estábamos llamando al middleware antes de la función de carga y eso estaba causando el error. Entonces, cuando lo cambiamos a esto, funcionó.

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

0

Esta no es una tarea difícil. Ese problema también ocurre en mi sitio, deberías tener que cambiar tus archivos js por orden superior. Porque en el lugar donde está utilizando el análisis JSON, esta vez sus archivos JS no están cargados. EJEMPLO #

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

cambiar a

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

0

Bueno, para todos los que realmente no pueden encontrar el error en cualquier parte de su código, ni "indefinido como dice en el almacenamiento local ni nulo" ... simplemente comente su código y escriba otro que realmente elimine el elemento en el almacenamiento local. . después de eso, puede comentar o borrar el código actual y restablecer nuevamente el anterior simplemente descomentando (si no lo borra ... si lo hizo, puede volver a escribirlo :))

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


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

La consola se mostrará nula y eso ... restablecerá tu código nuevamente si no funciona, amigo, tienes errores.

¡Lo siento por mi ingles!


-3

Recibía este error, cuando estaba usando la misma variable para json string y json analizado:

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

Cambié la función a:

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

Ahora este error desapareció.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.