javascript - leer - JSON.Parse, ''Untaught SyntaxError: Token inesperado o
leer json externo con javascript (4)
Sin comillas simples a su alrededor, está creando una matriz con dos objetos dentro de ella. Esta es la sintaxis de JavaScript. Cuando agrega las comillas, ese objeto (matriz + 2 objetos) ahora es una cadena. Puede usar JSON.parse
para convertir una cadena en un objeto JavaScript. No puede usar JSON.parse
para convertir un objeto JavaScript en un objeto JavaScript.
//String - you can use JSON.parse on it
var jsonStringNoQuotes = ''[{"Id":"10","Name":"Matt"},{"Id":"1","Name":"Rock"}]'';
//Already a javascript object - you cannot use JSON.parse on it
var jsonStringNoQuotes = [{"Id":"10","Name":"Matt"},{"Id":"1","Name":"Rock"}];
Además, su último ejemplo falla porque está agregando caracteres literales de comillas simples a la cadena JSON. Esto es ilegal La especificación JSON indica que solo se permiten comillas dobles. Si fueras a console.log
lo siguiente ...
console.log("''"+[{"Id":"10","Name":"Matt"},{"Id":"1","Name":"Rock"}]+"''");
//Logs:
''[object Object],[object Object]''
Vería que devuelve la representación de cadena de la matriz, que se convierte en una lista separada por comas, y cada elemento de la lista sería la representación de cadena de un objeto, que es [object Object]
. Recuerde, las matrices asociativas en javascript son simplemente objetos con cada par clave / valor siendo una propiedad / valor.
¿Por qué pasó esto? Como está comenzando con una cadena "''"
, entonces está tratando de agregarle la matriz, que solicita la representación de la cadena, y luego está agregando otra cadena "''"
.
Por favor, no confundas JSON con Javascript, ya que son cosas completamente diferentes. JSON es un formato de datos que es humanamente legible, y fue diseñado para coincidir con la sintaxis utilizada al crear objetos javascript. JSON es una cadena. Los objetos Javascript no son, y por lo tanto cuando se declaran en el código no están entre comillas.
Vea este violín: http://jsfiddle.net/NrnK5/
Esta pregunta ya tiene una respuesta aquí:
Tengo problemas con JSON devuelto por un servicio web. Parece que el JSON carece de comillas, pero cuando agrego comillas al JSON, aparece un error. Aquí está el mensaje de error: ''Untaught SyntaxError: Token inesperado o. Cuando registro la cadena en la consola: [object Object], [object Object]
Aquí hay un código de ejemplo que simula el error:
//Error I am trying to solve
var jsonString = ''[{"Id":"10","Name":"Matt"},{"Id":"1","Name":"Rock"}]'';
var myData = JSON.parse(jsonString);
$(document).ready(function() {
var $grouplist = $(''#groups'');
$.each(myData, function() {
$(''<li>'' + this.Name + ''</li>'').appendTo($grouplist);
});
});
Aquí está el mismo código con las comillas simples alrededor de la cadena. Funciona
//Successful Javascript
var jsonString = ''[{"Id":"10","Name":"Matt"},{"Id":"1","Name":"Rock"}]'';
var myData = JSON.parse(jsonString);
$(document).ready(function() {
var $grouplist = $(''#groups'');
$.each(myData, function() {
$(''<li>'' + this.Name + ''</li>'').appendTo($grouplist);
});
});
//Successful HTML
<ul id="groups"></ul>
Pero cuando trato de agregar comillas a la cadena, como parece que necesito en mi código real, falla:
//Does not work when I need to append quotes to the string:
var jsonStringNoQuotes = [{"Id":"10","Name":"Matt"},{"Id":"1","Name":"Rock"}];
jsonStringQuotes = "''" + jsonStringNoQuotes + "''";
var myData = JSON.parse(jsonStringQuotes);
$(document).ready(function() {
var $grouplist = $(''#groups'');
$.each(myData, function() {
$(''<li>'' + this.Name + '','' + this.Id + ''</li>'').appendTo($grouplist);
});
});
Aquí está el error: log cadena a consola: [object Object], [object Object] data.js: 809 Uncaught SyntaxError: Inexpected token ''
Estoy perplejo. Cualquier ayuda apreciada! ¡Gracias!
Tal vez lo que proviene del servidor ya está evaluado como objeto JSON? Por ejemplo, usando jQuery get method:
$.get(''/service'', function(data) {
var obj = data;
/*
"obj" is evaluated at this point if server responded
with "application/json" or similar.
*/
for (var i = 0; i < obj.length; i++) {
console.log(obj[i].Name);
}
});
Alternativamente, si necesita convertir el objeto JSON en el literal de cadena JSON, puede usar JSON.stringify
:
var json = [{"Id":"10","Name":"Matt"},{"Id":"1","Name":"Rock"}];
var jsonString = JSON.stringify(json);
Pero en este caso no entiendo por qué no puedes simplemente tomar la variable json
y referirte a ella en lugar de codificar y analizar.
Tu último ejemplo es JSON no válido. Las comillas simples no están permitidas en JSON, excepto dentro de las cadenas. En el segundo ejemplo, las comillas simples no están en la cadena, sino que sirven para mostrar el inicio y el final.
Ver http://www.json.org/ para las especificaciones.
Debería agregar: ¿Por qué piensas esto: "como parece necesitarlo en mi código real"? Entonces quizás podamos ayudarlo a encontrar la solución.
var jsonStringNoQuotes = [{"Id":"10","Name":"Matt"},{"Id":"1","Name":"Rock"}];
creará el objeto json. no hay necesidad de analizar.
jsonStringQuotes = "''" + jsonStringNoQuotes + "''";
devolverá ''[objeto]''
por eso (a continuación) está causando el error
var myData = JSON.parse(jsonStringQuotes);