2016-03-08 3 views
0

Я выборки данных из excelsheet и преобразования его в формат JSON используя xlsx-to-json в Node.jsКак изменить схему JSON значение в Javascript

Все значения данных в формате JSON, по умолчанию показаны в формате string как:

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

Когда я вставив этот json в MongoDB все значения становятся хранящегося в string типа данных.

Что я хочу сделать, это проверить всю эту схему и изменить ее тип данных, прежде чем вставлять его в mongodb.

Пример: идентификатор & телефон = number или integer, адрес электронной почты, имя = string, д.р. = DATE, адрес = TEXT и страна = ENUM

Конечный результат должен быть как:

var jsonObjResult = [ 
{ 
id: 101, //integer 
email: '[email protected]', //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: '[email protected]', //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: '[email protected]', //string 
name: 'user3', // string 
dob: '1990-10-12', //date 
phone: '1234567890', //number 
country: ['England', 'Australia', 'France'], // enum 
address: 'Building 201-A, Abc, Xyz' // text 
} 
]; 

Любая помощь будет оценена.

+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. 
}); 
1

Если вы хотите, чтобы иметь достоверные данные в MongoDB, вы должны подтвердить введенные данные, например, с Соответствуют (вилкой Revalidator - https://www.npmjs.com/package/conform). С помощью опции «castSource» она будет отличать значения исходного объекта, а затем вы вставляете данные с правильным типом в свой db.

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 
} 
Смежные вопросы