Tengo 7 MB de archivo .json y estoy filtrando los datos con mi node.js y almacenando los datos en una matriz displayMe. Cuando muestro esa matriz en corto en la consola, es visible en eso. Pero cuando trato de escribir esa matriz usando JSON.stringify. Me sale un archivo json con una matriz en blanco.

Aquí está el código:

var fs = require("fs");

var data = fs.readFileSync('India2011.json');

var myData=JSON.parse(data);//contains main array

var len=myData.length;//main array length

var k=1;
var count=0;

var displayMe=[];
var canRead=0;
var cannotRead=0;
for (var i = 0; i <len; i++) {

    for (var j = k; j <=35; j++) {
        var obj={};

    if ((myData[i]["State Code"]==(j))&&(myData[i]["Total/ Rural/ Urban"]=="Total")&&(myData[i]["Age-group"]=="All ages")) {

        obj["Literate - Persons"]=parseInt(myData[i]["Literate - Persons"]);
        obj["Illiterate - Persons"]=parseInt(myData[i]["Illiterate - Persons"]);
        obj["Total - Persons"]=parseInt(myData[i]["Total Persons"]);
        //sort.push(obj);
        displayMe[myData[i]["Area Name"]]=(obj);
        count+=(parseInt(myData[i]["Total Persons"]));
        canRead+=(parseInt(myData[i]["Literate - Persons"]));
        cannotRead+=(parseInt(myData[i]["Illiterate - Persons"]));
        ++k;
        };
    };
};

fs.writeFile( "displayMe.json", JSON.stringify( displayMe ), "utf8");// this part not working.

console.log(displayMe);//this is working

Esta es la salida de la consola:

[ 'State - JAMMU & KASHMIR': { 'Literate - Persons': 7067233,
    'Illiterate - Persons': 5474069,
    'Total - Persons': 12541302 },
  'State - HIMACHAL PRADESH': { 'Literate - Persons': 5039736,
    'Illiterate - Persons': 1824866,
    'Total - Persons': 6864602 },
  'State - PUNJAB': { 'Literate - Persons': 18707137,
    'Illiterate - Persons': 9036201,
    'Total - Persons': 27743338 },
  'State - CHANDIGARH': { 'Literate - Persons': 805438,
    'Illiterate - Persons': 250012,
    'Total - Persons': 1055450 },
  'State - UTTARAKHAND': { 'Literate - Persons': 6880953,
    'Illiterate - Persons': 3205339,
    'Total - Persons': 10086292 },
  'State - HARYANA': { 'Literate - Persons': 16598988,
    'Illiterate - Persons': 8752474,
    'Total - Persons': 25351462 },
  'State - NCT OF DELHI': { 'Literate - Persons': 12737767,
    'Illiterate - Persons': 4050174,
    'Total - Persons': 16787941 },
  'State - RAJASTHAN': { 'Literate - Persons': 38275282,
    'Illiterate - Persons': 30273155,
    'Total - Persons': 68548437 },
  'State - UTTAR PRADESH': { 'Literate - Persons': 114397555,
    'Illiterate - Persons': 85414786,
    'Total - Persons': 199812341 },
  'State - BIHAR': { 'Literate - Persons': 52504553,
    'Illiterate - Persons': 51594899,
    'Total - Persons': 104099452 }
    ]
0
Neo 9 may. 2016 a las 13:48

3 respuestas

La mejor respuesta

El problema era que el código js anterior no generaba una matriz en el formato JSON adecuado. Lo intenté y lo arreglé. aquí está el código de trabajo:

var fs = require("fs");

var data = fs.readFileSync('India2011.json');

var myData=JSON.parse(data);//contains main array

var len=myData.length;//main array length

var k=1;
var count=0;

var displayMe=[];
var canRead=0;
var cannotRead=0;
for (var i = 0; i <len; i++) {
     var obj2={};//changes here
    for (var j = k; j <=35; j++) {
        var obj={};
        var header;//changes here

    if ((myData[i]["State Code"]==(j))&&(myData[i]["Total/ Rural/ Urban"]=="Total")&&(myData[i]["Age-group"]=="All ages")) {

        obj["Literate - Persons"]=parseInt(myData[i]["Literate - Persons"]);
        obj["Illiterate - Persons"]=parseInt(myData[i]["Illiterate - Persons"]);
        obj["Total - Persons"]=parseInt(myData[i]["Total Persons"]);

        header= myData[i]["Area Name"];//changes here
        obj2[header]=obj;//changes here

        displayMe.push(obj2);//changes here
        count+=(parseInt(myData[i]["Total Persons"]));
        canRead+=(parseInt(myData[i]["Literate - Persons"]));
        cannotRead+=(parseInt(myData[i]["Illiterate - Persons"]));
        ++k;
        //console.log("Addesd "+myData[i]["Total Persons"]+" Time j: "+k+" State name"+myData[i]["Area Name"]+" i:"+i+"k:"+k+" count "+count);
        };
    };
};

fs.writeFile( "displayMe.json", JSON.stringify( displayMe ), "utf8");

console.log(displayMe);

Esos fueron los pocos cambios. Está trabajando ahora.

1
Neo 9 may. 2016 a las 11:31

Cita: "Pero cuando trato de escribir esa matriz usando JSON.stringify. Obtengo un archivo json con una matriz en blanco".

Esto se debe a que JSON no parece analizar o stringify las propiedades con nombre de un Array hybrid .

La longitud de su matriz es 0. Y el resultado seguramente será = [].

Deberá reemplazar Array:

[ 'State - JAMMU [...] Persons': 104099452 }  ]

Con un objeto apropiado:

{ 'State - JAMMU [...] Persons': 104099452 }  }
0
Bekim Bacaj 9 may. 2016 a las 12:10

El problema es causado por esta línea:

var displayMe = [];

Estás inicializando displayMe para ser una matriz vacía. Sin embargo, posteriormente está tratando esa matriz como un objeto:

displayMe[myData[i]["Area Name"]] = (obj);

Esto no encadenará a JSON correctamente, porque se supone que las matrices tienen propiedades particulares (como length) de las que depende JSON.stringify().

En su lugar, inicialice displayMe para que sea un objeto vacío:

var displayMe = {};
0
robertklep 9 may. 2016 a las 11:19