从JSON模式生成JavaScript类

时间:2019-03-14 07:38:45

标签: javascript json

我有一个JSON文件,其中包含有关我的工作的信息和数据,如下所示:

{
"Employes":[
        {
            "id": 1,
            "fullName": "Test Test"
        }
    ],
"Infos":[
        {
            "id": 1,
            "address": "Test Test test test test",
            "employes": 1
        }
  ]
}

我想在JS代码上自动生成EmployesInfos类,并向其中添加一些方法。

fetchJSONFile是使用AJAX从JSON文件获取数据的功能:

function fetchJSONFile(callback) {
    var httpRequest = new XMLHttpRequest();
    httpRequest.onreadystatechange = function() {
        if (httpRequest.readyState === 4) {
            if (httpRequest.status === 200) {
                var data = JSON.parse(httpRequest.responseText);
                if (callback) callback(data);
            }
        }
    };
    httpRequest.open('GET', 'datas.json');
    httpRequest.send(); 
}

因此,在generate函数上,我想自动生成类并为其分配对象,我尝试这样做:

function generate(nameOfObject){
        fetchJSONFile(function(data){
            employes = Object.assign(new Employes(), ...data[nameOfObject]);
            console.log(employes);
        });
    }

在这一行中,我将JSON对象分配给我的Employes()类,我的问题是如何自动生成JSON类型的Employes()分配,因此如果Infos是新{{1 }}成为新的Employes() ...等。

我想这样做,以便向这些类添加一些功能,例如Infos()addNew() ....等,所有关于CRUD的内容。

有什么解决办法吗?

2 个答案:

答案 0 :(得分:2)

如果返回的对象只有2个键,则可以map浏览条目并创建2个数组变量,如下所示:

如果您拥有2个以上的属性,则可以在内部switch内使用map

function Employee() { this.defaultEmployeeProp = "default" }
function Infos() { this.defaultInfosProp = "default" }

const data={"Employes":[{"id":1,"fullName":"Test Test"}],"Infos":[{"id":1,"address":"Test Test test test test","employes":1}]}

const [employees, infos] = Object.entries(data).map(([key, values]) =>
  values.map(e => Object.assign(key === "Employes" ? new Employee() : new Infos(), e))
)

console.log(employees)
console.log(infos)

如果您希望所有类型的对象都具有相同的prototype,则map内不需要三元数。创建一个通用构造函数或一个class,然后创建class的实例。如果您希望每种对象都有特定的行为,则可以始终extend使用该类,并使用上一小节中提到的switch

function GenericConstructor() {
  this.default = "default"
}

GenericConstructor.prototype.commonMethod = function() {
  console.log("common method called")
}

const data={"Employes":[{"id":1,"fullName":"Test Test"}],"Infos":[{"id":1,"address":"Test Test test test test","employes":1}]}

const [employees, infos] = Object.entries(data).map(([key, values]) =>
  values.map(e => Object.assign(new GenericConstructor(), e))
)

console.log(employees)
console.log(infos)

答案 1 :(得分:2)

您可以创建一个DynamicClass类,它接受一个输入值,另外一个type可以是Employes, Infos...

function DynamicClass (data, type) {
  this.type = type;
  // Init function
}
DynamicClass.prototype.xxxx = function () {}

您现在可以只使用数据对象来创建类。

fetchJSONFile(function(data){
  for(var key in data) {
    var classObj  = new DynamicClass(data[key], key);
  }
});