Tengo una matriz de pandas con np.NaN que convierto en un diccionario para JSON
json_data = {"freq" : list(df["Data"])}
Me preparo para cargar en una página web a través del matraz jsonify
@dashboard.route('/command', methods = ['GET', 'POST']) def command(): [...] return jsonify(json_data)y por el lado de javascript me preparo para leerlo.
$.ajax({ url: '/dashboard/command', type: 'POST', data: data, contentType: 'application/json; charset=utf-8', dataType: 'json', success: function(msg) { if (!msg.error) { updatePlot(msg); } else { alert(msg.error); } }, error: function (XMLHttpRequest, textStatus, errorThrown) { alert("There has been an error retrieving your data: \n\n" + errorThrown); }, complete: function() { $("#update-plot").prop('disabled', false); // Re-enable button $("#update-plot-loading").addClass('invisible'); // Hide loading animation }Y ahí es donde muere si cargo esa página web. Dice que tiene un token "N" incorrecto en el json. Si reemplazo los NaN antes de intentar enviar, por ejemplo
df["Data"].replace(np.NaN, -999.999)y todo está bien y el javascript puede continuar. Soy consciente de que los NaN deberían ser "nulo" en el lado de javascript, así que lo que hago en este momento (ugh) es convertir los -999.999 en "nulo" ... Pero Dios, ¿no debería haber una manera? enviar los datos que faltan directamente?
¿Alguna sugerencia? Probé muchas combinaciones de NaN, "NaN", Ninguno, etc. Pero tal vez me perdí una. Revisé la salida de jsonify en Python y parece ser una respuesta válida para enviar.
gracias, t
Ajá. Progreso, algo así. Al menos en el lado de Flask, tal vez no en Ajax. Considere un Pandas con algo de np.Nan en él ... Conviértalo en un dictado o lo que sea y luego llame a render_template
s = render_template('dashboard/dashboard_horizontal.html', average_data = average_data)Aquí es donde se hace el daño... pero se puede arreglar con
s = s.replace("nan", "NaN") #this is dumb but works!! Un problema relacionado ocurre con false en json. Cuando lo lees en Python, el analizador lo convierte convenientemente en False . Excepto que ahora creó un problema en el lado de Javascript, pero también se puede solucionar de la misma manera.
s = s.replace("False", "false") #this is dumb tooNo sé si hay algunas palabras clave que podrían pasarse a render_template para hacer esto automáticamente.
Ok, también tengo una solución Ajax para NaN, que es la idea de JSON5 que se explica aquí: Cómo analizar la cadena JSON que contiene "NaN" en Node.js. Específicamente, no use dataType json, vaya con 'texto' y realice el análisis a mano.
$.ajax({ url: '/dashboard/command', type: 'POST', data: data, contentType: 'application/json; charset=utf-8', dataType: 'text', // it was 'json' //async: false, success: function(msg) { if (!msg.error) { var data = json5.parse(msg); // json5 so much more friendly updatePlot(data); } else { alert(msg.error); } }, error: function (XMLHttpRequest, textStatus, errorThrown) { alert("Error:\n\n" + errorThrown); }, complete: function() { $("#update-plot").prop('disabled', false); // Re-enable button $("#update-plot-loading").addClass('invisible'); } }); }