Convert JSON to Javascript Array Object - node.js

28,833

Solution 1

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

Solution 2

Your code is very close:

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

You get object that has Array set as value for key "results".

Solution 3

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.

Share:
28,833
MayNotBe
Author by

MayNotBe

Updated on June 12, 2020

Comments

  • MayNotBe
    MayNotBe almost 4 years

    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.

  • TaoPR
    TaoPR almost 9 years
    The OP's requirement may nor may not rely on async I/O. But I agree with you that whenever it's possible and beneficial using async I/O on node.js, why don't use it.