根据 JSON 文件获取对象的架构

Get schema of object according to JSON files

本文关键字:取对象 获取 JSON 文件 根据      更新时间:2023-09-26

我有大量的JSON文件,从公共API中提取。借助 Node.js,我正在尝试获取文件正在描述的对象的模式(键/值类型),这与猫鼬中描述模式的方式相同,例如:

schema = {
  key1: 'Number',
  key2: 'Boolean',
  key3: {
    key31: 'String',
    key32: 'Boolean'
  },
  key4: [{
    key41: 'String',
    key42: 'Number'
  }]
};

为了做到这一点,我写了一个脚本,它获取第一个文件,获取键和值的类型(递归,因为对象有子对象);然后将第二个文件与第一个文件进行比较,如果第一个文件缺少一些键,则添加一些数据,依此类推......也许不是实现我想做的事情的最佳解决方案,但它(几乎)完成了工作。

不幸的是,运行脚本后,所有类型的子对象数组(上面示例中的key41key42)都显示为string,尽管我有一些booleannumber...

这是我从现在开始所做的:

var glob = require('glob'),
    _ = require('lodash');
function getSchema(from, to) {
  for (var kay in from) {
    if (from.hasOwnProperty(key)) {
      if (_.isObject(from[key])) {
        //_.isObject() returns true for arrays
        if (_.isArray(from[key])) {
          if (!to.hasOwnProperty(key)) {
            to[key] = [{}];
          }
          if (from[key].length) {
            var tmp = {};
            for (var i = 0; i < from[key].length; i++) {
              getSchema(from[key][i], tmp);
            }
            getSchema(tmp, to[key][0]);
          }
        } else {
          if (!to.hasOwnProperty(key)) {
            to[key] = {};
          }
          getSchema(from[key], to[key]);
        }
      } else {
        to[key] = typeof from[key];
      }
    }
  }
};
glob('./data/**/*.json', {}, function(err, files) {
  if (err) console.log(err);
  var schema = {};
  _.forEach(files, function(file) {
    var data = require(file);
    getSchema(data, schema);
  });
  //schema should be an object, mirroring the schema of the JSON files
});

有人可以帮我解决这个问题吗?

提前谢谢。

你的最后陈述,

to[key] = typeof from[key];

应该是

to[key] = from[key]

除非我读错了,并且示例键:值对包含"值"的实际值而不是类型。