2009-11-28 8 views
5

Estoy usando la función ajax de jQuery para presionar una URL de dominio cruzado. La url regresará json. Estoy en la fase de descubrimiento con esto, pero creo que, dado que los valores json contienen varias cadenas '& quot', la evaluación json arroja un error y detiene la ejecución de mi script del lado del cliente. El error que obtengo es "literal de cadena sin terminar". Sé que si codifico el json devuelto poniéndolo en un div local y elimino el '& quot;' cadenas (y un par de caracteres especiales ocultos), puedo hacer que el json evalúe con éxito. Ya sea a través de una reparación o mediante una corrección en mi código, ¿qué puedo hacer para obtener el json de la url y almacenarlo en mi lado del cliente javascript como un objeto json válido?con jQuery, acceda a json desde la URL de dominio cruzado donde json puede estar pobremente formado

mi código actual. ninguna de las funciones definidas (éxito, completa, error, filtro de datos) se ejecuta:

$(function() { 
    $.ajax({ 
    url: "http://www.codemash.org/rest/sessions.json?format=jsonp&callback=?", 
    dataType: "jsonp", 
    success: successFunc, 
    complete: completeFunc, 
    error: errorFunc, 
    dataFilter: dataFilterFunc 
}); 

}); 

function successFunc() { console.log('successFunc(). enter.'); } 
function completeFunc() { console.log('complete(). enter.'); } 
function errorFunc() { console.log('errorFunc(). enter.'); } 
function dataFilterFunc(data, type) { 
    data.replace(/\W/g, ' '); 
    return data; 
} 

Respuesta

1

Hmm. No sé jQuery, pero sé JSON. (Escribí un analizador basado en C++). Fui a la url que muestra: http://www.codemash.org/rest/sessions.json?format=jsonp&callback=?. El analizador JSON de Python lo acepta, y mi experiencia es que el analizador JSON de Python es correcto. Tenga en cuenta que esto:

{ "blah": "string " More more more" } 

... es JSON válido. La parte " no obtiene una interpretación especial en JSON, solo son caracteres en la cadena.


Editar: Mirando más duro en esto, me parece muy interesante que lo que está generando este se escapa alguna barras diagonales, pero no todos. Los elementos "Inicio" son "/ Fecha (-XXXXX) /", que es el texto /Date(-XXXXX)/ -/en JSON se puede escapar de manera opcional. Sin embargo, en elementos con las teclas "SpeakerURI" y "URI", no se escapan.


Editar: Lo encontré en mi analizador basado en C++. Inicialmente no lo tomó, pero este JSON realmente expuso un error en mi analizador sintáctico.

+0

Es una convención de MS para serializar objetos .NET 'DateTime': http://msdn.microsoft.com/en-us/library/bb299886(loband).aspx#intro_to_json_sidebarb –

0

Quizás desee probar el plugin jquery-jsponp, que soluciona algunos problemas con el manejo jsonp de jQuery.

http://code.google.com/p/jquery-jsonp/

lo uso y hay un montón de ejemplos.

Realmente necesita hacer funcionar sus devoluciones de llamada para que pueda ver lo que está pasando.


Actualización: He recibido una puñalada con jsonp y estoy recibiendo errores de token inesperados. No estoy seguro por qué: puedo tomar los datos manualmente de la URL, asignarlos a una variable de JavaScript en la consola, y todo está bien.

+0

¿Dice dónde en el JSON? Si necesita algo con saltos de línea, coloco uno aquí: http://pastebin.com/m65681d28 - esto parece un error en el analizador JSON. – Thanatos

+0

Lo siento. No hay tiempo para rastrear esta noche. Quizas mañana. – Nosredna

+0

También tuve que modificar la línea 250 en pastbin.com/m65681d28 para que el json lo analizara. Si recuerdo correctamente, tuve que reemplazar los 'espacios' después de "Nivel:" y "Duración:". Verificare mañana. – mark

3

El problema es el servicio JSONP, descarta por completo el parámetro callback.

Un JSONPrespuesta es simplemente una llamada de función con el parámetro callback consigue como el nombre de la función:

Si se mira la respuesta de algún servicio JSONP, debería ser así:

http://somesite.com/jsonp?callback=MyCallback

regresarían:

myCallback({/*json*/}); 

Mientras que el you post está volviendo llanuravalid JSON, pero no puede ser manejado como una respuestaJSONP.

+1

Ooh, el enlace JSON lint es valioso, gracias. – Thanatos

+1

Sí. Eso es. Buena atrapada. – Nosredna

0

Después de analizar sus datos en una hora,

me encontré siguiendo

{ 
    "URI":"/rest/sessions/Maintainable-ASPNET-MVC", 
    "Title":"Maintainable ASP.NET MVC", 
    "Abstract":".....\u003e\u2028Duration: 60-90 minutes\u003cbr\u003e\u2028Subject Area: development....." 
} 

No es CHAR \ u2028 antes duración y su área de competencia,

\ u2028 está separador de línea, por lo que su significa, tipo de \ n, por lo que tiene un salto de línea entre las comillas "", que puede ser un caso raíz.

Si elimina eso, no verá cadena sin terminar literal en firebug.

Para probar que, pegar siguiente en la barra de direcciones, Firefox y Opera falla, mientras que IE8 y Chrome está trabajando

javascript:alert(eval('[{"Abstract":"\u003e
 Duration: 60-90 minutes\u003cbr\u003e
 Subject Area: development."}]')) 

alguien escribió en su blog acerca de que ya

http://bulknews.typepad.com/blog/2009/02/json-jquery-and-some-unicode-characters-u2028.html

+0

No, eso es válido UTF-8: es U-2028, que es un separador de línea. Tu decodificación falló porque la escribiste mal. No afecta la validez del texto JSON. – Thanatos

+1

¿Y qué actualización hiciste? La presencia de un U + 2028 dentro de una cadena JSON es JSON válida. – Thanatos

+0

Desplazamiento 0x62E1 dentro del texto JSON es el que está buscando, ¿correcto? – Thanatos

0

no lo hago parece estar más cerca de una solución del lado del cliente. Cambié el código para usar jQuery-jsonp. Ahora parece que esto:

$(function() { 
    $.jsonp({ 
    url: "http://www.codemash.org/rest/sessions.json?format=jsonp&callback=?", 
    async: false, 
    dataType: "jsonp", 
    success: successFunc, 
    complete: completeFunc, 
    error: errorFunc, 
    dataFilter: dataFilterFunc 
}); 

}); 

function successFunc(json, textStatus) { 
    console.log('successFunc(). enter.'); 
} 
function completeFunc(xOptions, textStatus) { 
    console.log('complete(). textStatus: ['+textStatus + ']'); 
} 
function errorFunc(xOptions, textStatus) { 
    console.log('errorFunc(). textStatus: [' + textStatus + ']'); 
} 
function dataFilterFunc(j) { 
    console.log('dataFilterFunc(). enter.'); 
    return j; 
} 

registro de la consola de Firebug muestra:

X unterminated string literal 
[{"URI"..... (the json returned from the server 
errorFunc(). textStatus: [error] 
complete(). textStatus: [error] 

Por alguna razón, el análisis sintáctico JSON en mi navegador Firefox (FF v3.0.15, Linux Ubuntu 9.0.4) está lanzando la excepción "cadena literal sin terminar". Sé que si elimino las cadenas '& q u o t' y dos caracteres en el bloque 'Maintainable ASP.NET MVC' entonces el json se analizará correctamente. Como no tengo control en el lado del servidor, ¿hay algo que pueda hacer con javascript en el lado del cliente que eventualmente obtenga la cadena json del servidor, tal como está, en un objeto json del lado del cliente? Pensé que la propiedad dataFilter para jsonp se configuró exactamente para ese propósito, para interceptar el json y 'scrub'. Sin embargo, esa función en mi código no se llama, posiblemente porque el json que se pasa a la función dataFilterFunc no se analizará correctamente.