JSON a la tabla de datos: ¿cómo evitar que las columnas NULL se eliminen automáticamente?Hola a todos,
Estoy usando JMP 15 y tengo JSL que recupera una carga JSON a través de Http Request(), la ejecuta a través de Char to Blob() y luego la abre() en una tabla de datos. El contenido de la carga útil de JSON es dinámico, pero siempre se puede asignar a un formato tabular (filas y columnas).
El problema: si alguna clave en el JSON tiene todos los valores NULL, no se incluye en la tabla de datos (es decir, no se crean columnas para estas claves). Esto es problemático, porque quiero que todas las claves en JSON se muestren como columnas en la tabla de datos, ya sea que todos los valores sean NULL o no.
Si guardo la carga útil en un archivo local y lo abro directamente usando Open(), obtengo el resultado deseado: una tabla de datos donde todas las claves se convierten en columnas y todos los valores NULL se muestran como NULL. Sin embargo, esto no funcionará para mi caso de uso.
Aquí está JSL básico que replica el problema. En lugar de Http Request(), recupero los datos con Load Text File(), que da los mismos resultados. Se adjunta el archivo "data.json".
dt1 = Open("/Users/abc/data.json", JSON ); // works as desired
raw = Load Text File("/Users/abc/data.json");
jsonblob = Char To Blob( raw );
dt2 = open(jsonblob, "JSON", Guess("wide")); // does not work as desired -- drops all-NULL columns¿Alguien puede sugerir un método para convertir JSON en una variable en una tabla de datos que conserve las claves NULL?
¡Gracias!
Andy
Compartir y comunicar resultadosRe: JSON a la tabla de datos: ¿cómo evitar que las columnas NULL se eliminen automáticamente?Las matrices JSON que no tienen elementos son problemáticas para JMP.Una opción es reemplazar matrices vacías con matrices que tengan al menos un hijo.Puede hacer que ese hijo sea nulo o usar el carácter de valor faltante - [.].Creo que esto significa que ya no tendrá JSON válido, pero JMP 16 aún lo leerá y en este momento no hay ningún plan para romper ese comportamiento.Usar nulo creará una columna de caracteres y usar el valor faltante creará una columna numérica.Si sabe que no hay datos de cadena en su JSON que contengan [], simplemente puede hacer este cambio
raw = Load Text File("$downloads/data.json");
jsonblob = Char To Blob( substitute(raw,"[]",".") );
dt2 = open(jsonblob, "JSON", Guess("wide"));
Si desea protegerse contra el reemplazo de [] en cadenas JSON, se necesitarán algunas líneas más de jsl para omitir cadenas, pero aún así no debería ser demasiado difícil.
Re: JSON a la tabla de datos: ¿cómo evitar que las columnas NULL se eliminen automáticamente?Gracias por la nota, @Craige_Hales .He informado la deficiencia anotada en la viñeta 1 al equipo de desarrollo para que la considere en una versión futura de JMP.
Por lo que vale, parece que estos no eliminan las columnas nulas en JMP 14.3.
raw = Load Text File( "$DOWNLOADS/data.json" );
jsonblob = Char To Blob( raw );
dt2 = Open( jsonblob, "JSON", Guess( "wide" ) );
JSON To Data Table( raw, Guess( "wide" ) );
Re: JSON a la tabla de datos: ¿cómo evitar que las columnas NULL se eliminen automáticamente?Y si tiene algún control sobre la fuente del json y puede obtenerlo como un formato de pandas real,
orient='table' (in python code)
podría ser una buena elección. La importación de JMP puede usar algunos de esos metadatos. JMP también puede leer las otras orientaciones.
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_json.html
Re: JSON a la tabla de datos: ¿cómo evitar que las columnas NULL se eliminen automáticamente?- Bien, creo que la opción amplia es la opción correcta para usar y es un error que todas las columnas que faltan se eliminen de la importación.@Wendy_Murphrey Ciertamente complica las cosas.
- Si conoce todas las columnas posibles y solo un subconjunto estará en el JSON, puede enumerarlas todas en la configuración de JSON. Primero haga una pequeña prueba, vea si funciona de la manera que necesita (no estoy seguro de si obtendrá el conjunto completo de columnas o solo el subconjunto que aparece en el JSON).
- Todavía hay acceso a una versión anterior del código de importación JSON; especificar JSON (sin la CONFIGURACIÓN DE JSON o el parámetro Guess) puede hacer lo que desea.
blob=loadtextfile("$DESKTOP/data.json",blob);
Open(blob,JSON)- El JSON no se parece exactamente a ninguno de los formatos de pandas. Pero la opción pandas parece recuperar los nombres de columna que desea; si nada más funciona, ese podría ser un punto de partida para crear la configuración JSON sobre la marcha para una segunda importación para obtener realmente los datos.
- No hay un documento específico sobre la configuración de JSON que yo sepa; está destinado a ser escrito por el asistente y aún legible por humanos. Coincide con los valores del cuadro de diálogo del asistente, y hay algún documento allí.
- Estoy bastante seguro de que los ImportSettings son utilizados por la importación de CSV, y tal vez algo más. No los utiliza el asistente JSON.
(actualización: un par de pequeñas ediciones)
Re: JSON a la tabla de datos: ¿cómo evitar que las columnas NULL se eliminen automáticamente?Gracias por las sugerencias, Craige. Los probé y tengo algunas preguntas de seguimiento:
1. cambiar Guess de "ancho" a "pandas" incluye con éxito las columnas NULL en la tabla de datos; desafortunadamente, presenta un nuevo problema: la última "fila" de datos JSON se repite para cada fila de la tabla de datos ( consulte "pandas.png", adjunto: el número de lote 21055 se repite dos veces y el número de lote 21054 no está incluido. Repliqué este mismo comportamiento con un conjunto de datos más grande).
¿Hay algún otro parámetro o configuración de Open() que pueda corregir esto?
2. Pude importar con éxito el archivo data.json, incluidas las columnas NULL, usando el asistente; sin embargo, el script que produjo es específico para la carga útil en data.json (ver "script_view.png", adjunto). Mi caso de uso es más general: las cargas útiles que recibe mi JSL variarán en la cantidad de columnas y etiquetas de columna. ¿Hay alguna manera de usar la salida del asistente para crear una opción de configuración más genérica? ¿O mi única opción es iterar manualmente sobre la carga útil y construir la tabla de datos columna por columna?
2b. Relacionado con esto, ¿puede señalarme alguna documentación para usar el parámetro "Configuración JSON" con Open ()? No pude encontrar nada en la referencia de sintaxis o el índice de secuencias de comandos (y cuando busco en Google 'JMP JSL "Configuración de JSON"', el resultado principal es mi pregunta anterior en este foro).
3. ¿Hay alguna forma de forzar a Open() a importar columnas vacías como numéricas? Intenté "Tratar columnas vacías como numéricas (1)" en la configuración de importación y provocó que el archivo data.json se tratara como una sola línea/registro (ver "pandas_numeric.png, adjunto), así que supongo que lo estoy haciendo algo incorrecto
¡Gracias!
Andy
Re: JSON a la tabla de datos: ¿cómo evitar que las columnas NULL se eliminen automáticamente?Escribí una respuesta a continuación que podría ayudar, luego me di cuenta de que hay una respuesta simple que debes probar primero. Los datos parecen ser uno de los formatos de pandas, así que cambie "ancho" a "pandas".
Si eso sale mal, intente...
Use el asistente para seleccionar explícitamente las columnas, luego use ese script.
You'll probably want the stack option too.You'll probably want the stack option too.Probablemente también querrá la opción de pila.
También cambié el generador de filas de raíz a elementos, porque es un poco más correcto. Probablemente no hará una diferencia real.
El elemento seleccionado para Fila hace que se escriba una nueva fila en la tabla de datos cada vez que aparece ese elemento. Encienda las estadísticas y podrá ver los elementos que se repiten 2 veces.