Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Convert JSON to Javascript Array Object - node.js

I don't know any Javascript. I have a .json file that looks like this:

{ "results": [
{
    "challenger": {
        "__type": "Pointer",
        "className": "Player",
        "objectId": "STWAxAHKay"
    },
    "challengerScore": 18,
    "createdAt": "2014-12-05T21:43:01.099Z",
    "defender": {
        "__type": "Pointer",
        "className": "Player",
        "objectId": "UGAmRVd7Tr"
    },
    "defenderScore": 21,
    "objectId": "pmiACGwe45",
    "updatedAt": "2014-12-05T21:43:01.099Z"
},
{
    "challenger": {
        "__type": "Pointer",
        "className": "Player",
        "objectId": "STWAxAHKay"
    },
    "challengerScore": 23,
    "createdAt": "2014-12-05T21:43:01.969Z",
    "defender": {
        "__type": "Pointer",
        "className": "Player",
        "objectId": "UGAmRVd7Tr"
    },
    "defenderScore": 25,
    "objectId": "HqptXdYmQL",
    "updatedAt": "2014-12-05T21:43:01.969Z"
}
]}

I'm reading it into my script like this:

var fs = require('fs');
var results = JSON.parse(fs.readFileSync('Game.json', 'utf8'));

results is an object but it's not an array.

I would like to make it an array so I can iterate through each game, grab the data I need from each game and use it to create a new object that I ultimately save in a .json file.

I would love for someone to guide me through this entire process but I would be thrilled if someone can just show me how to make an array of games that I can iterate through just to get me started.

Thank you.

like image 316
MayNotBe Avatar asked Mar 08 '26 23:03

MayNotBe


2 Answers

You can try Javascript's inbuilt functions like this:

var fs = require('fs');
var results = JSON.parse(fs.readFileSync('games.json', 'utf8'));

function grabDataFromAGame(elem, index, array) {
    // Grab the data from the game object you need
    var gameObj = {};
    gameObj.challengerScore = elem.challengerScore;
    gameObj.defenderScore = elem.defenderScore;
    gameObj.id = elem.objectId;
    saveGameObjToFile(gameObj);
}

function saveGameObjToFile(gameObj){
    var gameFile = fs.openSync('./gameObj-' + gameObj.id + '.json', 'w');
    fs.writeSync(gameFile, JSON.stringify(gameObj));
}
results.results.forEach(grabDataFromAGame);

This code generated the following files:

~/salesman 542-> node so.js 
~/salesman 543-> 
~/salesman 543-> 
~/salesman 543-> ll gameObj-*
-rw-r--r--  1 neerajsharma  staff    59B Jun 11 18:56 gameObj-pmiACGwe45.json
-rw-r--r--  1 neerajsharma  staff    59B Jun 11 18:56 gameObj-HqptXdYmQL.json
~/salesman 544-> cat gameObj-pmiACGwe45.json | python -m json.tool
{
    "challengerScore": 18,
    "defenderScore": 21,
    "id": "pmiACGwe45"
}
~/salesman 545-> 

Note that it is not recommended to use sync calls with Node, because node is single-threaded and your application is blocked till the sync calls are complete.

An example of using forEach can be found here

like image 70
Neeraj Sharma Avatar answered Mar 11 '26 12:03

Neeraj Sharma


Try:

results.results.forEach(function (result) {
    console.log(result);
});

You should try to use the async calls. Node.js is really meant for asynchronous non-block I/O.

like image 42
beautifulcoder Avatar answered Mar 11 '26 13:03

beautifulcoder