Soy muy nuevo en JavaScript y me han dado la tarea de convertir varios archivos JSON en hojas de cálculo de Excel. Tengo problemas para entender cómo analizar un archivo JSON que tiene objetos anidados o matrices anidadas. Por favor, perdóname si no estoy usando la redacción correcta. La siguiente es una muestra de los datos JSON que necesito analizar.
[{ "name": "Kindergarten", "subject": "Math", "framework": "NC: Standard Course of Study", "standards": [ { "id": 1306687, "name": "NC.K.CC.1", "short_description": "Standard 1." }, { "id": 1306688, "name": "NC.K.CC.1.a", "short_description": "Standard 2." }, { "id": 1306689, "name": "NC.K.CC.1.b", "short_description": "Standard 3." } ] }]He probado tantos bucles diferentes y parece que solo puedo analizar la primera parte del archivo y no la parte anidada. Básicamente necesito que los datos se vean así cuando estén listos:
name subject framework standards/0/id standards/0/name standards/0/short_description Kindergarten Math NC: Standard Course of Study 1306687 NC.K.CC.1 Standard 1. Kindergarten Math NC: Standard Course of Study 1306688 NC.K.CC.1.a Standard 2. Kindergarten Math NC: Standard Course of Study 1306689 NC.K.CC.1.b Standard 3.Cualquier orientación que pueda dar será inmensamente útil.
Simplemente use JSON.parse("<your JSON string>") para analizar. Esta función devuelve un árbol de objetos que refleja el JSON procesado. Luego puede acceder a todas las propiedades del objeto en su ciclo y generar un archivo CSV, que se puede abrir con Excel.
let csv = ""; const objects = JSON.parse("<your JSON string>"); for (const o of objects) { for (const std of o.standards) { csv += `${o.name},${o.subject},${o.framework},${std.id},${std.name},${std.short_description}`; } }Ejemplo de trabajo:
const jsonData = `[{ "name": "Kindergarten", "subject": "Math", "framework": "NC: Standard Course of Study", "standards": [{ "id": 1306687, "name": "NC.K.CC.1", "short_description": "Standard 1." }, { "id": 1306688, "name": "NC.K.CC.1.a", "short_description": "Standard 2." }, { "id": 1306689, "name": "NC.K.CC.1.b", "short_description": "Standard 3." } ] }]`; /* Escapes all quotes in the input in order to not break the CSV */ function val(input) { return input?.replaceAll ? input.replaceAll('"', '""') : input; } let csv = ""; const objects = JSON.parse(jsonData); for (const o of objects) { for (const std of o.standards) { csv += `"${val(o.name)}","${val(o.subject)}","${val(o.framework)}","${val(std.id)}","${val(std.name)}","${val(std.short_description)}"`; } } console.log(csv);EDITAR: modificó el código fuente para generar más CSV guardados (ahora se permiten comillas dobles y comas en la entrada). ¡Gracias a @phuzi!
Creo que el problema es que está tratando de encontrar una solución de codificación solo con js y excel, que no creo que funcione, ya que las bibliotecas js excel con las que estoy familiarizado solo funcionan con json, no con json anidado. Este código funcionará y se ejecutará, pero solo toma el primer nivel de json, no el anidado, que es el segundo nivel. Usé npm para instalar el módulo XLSX con: npm install xlsx en la terminal.
const XLSX=require('xlsx') const jsonData= [{ "name": "Kindergarten", "subject": "Math", "framework": "NC: Standard Course of Study", "standards": [ { "id": 1306687, "name": "NC.K.CC.1", "short_description": "Standard 1." }, { "id": 1306688, "name": "NC.K.CC.1.a", "short_description": "Standard 2." }, { "id": 1306689, "name": "NC.K.CC.1.b", "short_description": "Standard 3." } ] }] const convertJsonToExcel=()=>{ const workSheet = XLSX.utils.json_to_sheet(jsonData); const workBook = XLSX.utils.book_new(); XLSX.utils.book_append_sheet(workBook, workSheet, "jsonData"); XLSX.write(workBook, {bookType: "xlsx", type:"buffer"}) XLSX.writeFile(workBook, "jsonData.xlsx") } convertJsonToExcel()Entonces, mi punto es que es posible que no tenga una solución, a menos que agregue otra biblioteca de idioma como python o aplane el archivo json ANTES de intentar exportarlo a Excel usando el código.
Esto es lo que encontré en una pregunta similar en Code Project Export Nested Json to Excel :
Estos son datos que no se pueden mostrar en una hoja de Excel, ya que Excel solo puede mostrar una tabla simple, donde tiene una estructura de datos de varios niveles...
Para resumir, creo que está buscando la solución incorrecta si intenta usar solo JavaScript.
Tienes un documento:
let doc= '[{ "name": "Kindergarten", "subject": "Math", "framework": "NC: Standard Course of Study", "standards": [ { "id": 1306687, "name": "NC.K.CC.1", "short_description": "Standard 1." }, { "id": 1306688, "name": "NC.K.CC.1.a", "short_description": "Standard 2." }, { "id": 1306689, "name": "NC.K.CC.1.b", "short_description": "Standard 3." } ] }]' Analizar a un objeto json con JSON.parse(doc) Luego puede iterar sobre la matriz JSON con "Nested For Loops":
let data = JSON.parse(doc); for (let i =0; i < data.length; i++) { for(let j = 0; j < data[i].standards.length; j++) { // obviously you aren't logging to console but for purposes of the demonstration I will console.log(`${data[i].name},${data[i].subject},${data[i].framework},${data[i].standards[j].id},${data[i].standards[j].name},${data[i].standards[j].short_description}`); } }