如何在Javascript

时间:2016-03-08 11:20:19

标签: javascript json excel mongodb mean-stack

我从excelsheet获取数据并使用Node.js中的JSON将其转换为xlsx-to-json格式

默认情况下,JSON数据的所有值都以string格式显示,如:

var jsonObj = [
 { 
 id: '101', // string
 email: 'user1@test.com',  //string
 name: 'user1',
 dob: '1990-10-10',
 phone: '1234567890', //string
 country: 'England',
 address: 'Building 201-A, Abc, Xyz'
 },
 { 
 id: '102',
 email: 'user2@test.com',  
 name: 'user2',
 dob: '1990-10-11',
 phone: '1234567890',
 country: 'Australia',
 address: 'Building 201-A, Abc, Xyz'
 },
 { 
 id: '103',
 email: 'user3@test.com',  
 name: 'user3',
 dob: '1990-10-12',
 phone: '1234567890',
 country: 'France',
 address: 'Building 201-A, Abc, Xyz'
 }
 ];

当我将此json插入mongodb时,所有值都以string数据类型存储。

我想要做的是验证所有这个架构并在将其插入mongodb之前更改其数据类型。

示例:id&电话= numberinteger,电子邮件,姓名= string,dob = DATE,地址= TEXT和国家= ENUM

最终输出应该是:

var jsonObjResult = [
 { 
 id: 101, //integer
 email: 'user1@test.com', //string 
 name: 'user1', //string
 dob: '1990-10-10', //Date
 phone: '1234567890', //number
 country: ['England', 'Australia', 'France'], // enum
 address: 'Building 201-A, Abc, Xyz' // text
 },
 { 
 id: '102', // integer
 email: 'user2@test.com',  //string
 name: 'user2', // string
 dob: '1990-10-11', //date
 phone: '1234567890', // number
 country: ['England', 'Australia', 'France'], // enum
 address: 'Building 201-A, Abc, Xyz' // text
 },
 { 
 id: '103', //integer
 email: 'user3@test.com',  //string
 name: 'user3', // string
 dob: '1990-10-12', //date
 phone: '1234567890', //number
 country: ['England', 'Australia', 'France'], // enum
 address: 'Building 201-A, Abc, Xyz' // text
 }
 ];

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:1)

如果要在MongoDB中拥有有效数据,则必须使用Conform(Revalidator的分支 - https://www.npmjs.com/package/conform)验证输入。选项' castSource'它将转换源对象的值,然后您将在数据库中插入具有正确类型的数据。

var Conform = require('conform');

var myData = {
    intField: '123'
};

// after validate intField will be casted to integer
var validateResult = Conform.validate(
    myData,
    {
        properties: {
            intField: {
                type: 'integer'
            }
        }
    },
    {
        cast: true,
        castSource: true
    });

if (validateResult.valid) {
    // insert myData to db
}

答案 1 :(得分:0)

我已经创建了一个如何操作的小例子,你必须自己添加缺少的解析器。

首先创建一个解析器,这只是一个为每个需要转换的对象键提供函数的对象。

var parsers = {
    id: parseInt,
    dob: function(str) {
        return new Date(str);
    },
    phone: parseInt
};

// This will parse the object and apply the transform parsers from above, calls the callback when finished
var parseObject = function(obj, callback) {
    var counter = 0;
    Object.keys(obj).forEach(function(key, index, array) {
        if (parsers.hasOwnProperty(key) /* && typeof parsers[key] === 'function' */) { // typeof check is not really needed, when he trust that we only define functions in our parser above
            obj[key] = parsers[key](obj[key]);
        }
        if (++counter === array.length) {
            callback && callback(); // call the callback when all parsers have run
        }
    });
};

var parseJson = function(json, callback) {
    var counter = 0;
    for (var i = 0; i < json.length; i++) {
        parseObject(json[i], function() { // parses all the objects
            if (++counter === json.length) {
                callback && callback(); // call the callback when all objects have been parsed
            }
        });
    }
};

parseJson(jsonObj, function() {
    console.log(jsonObj); // outputs the parsed object when everything is done.
});