简体   繁体   中英

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.

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.

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".

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

You should be able to access it as follows:

for (var i = 0; i < results.results.length; i++) {
    results.results[i].challengerScore; //some game data
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM