【问题标题】:Create a JavaScript Class from a JSON Object从 JSON 对象创建 JavaScript 类
【发布时间】:2019-08-04 12:34:34
【问题描述】:

我有一个包含信息数据的 JSON 文件,我使用 AJAX 使用此函数获取此数据。

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', 'database.json');
    httpRequest.send(); 
}

然后我把它取出来分配给当前类的对象:

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

我的 JSON 文件中的数据是这样的:

{

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

我的问题是如何从 JSON 文件中自动生成每种对象类型的类。

使用我的代码,例如,我想在此处自动生成 Employes 和 Infos 类,而无需手动创建它们。

fetchJSONFile(function(data){ 
        employes = Object.assign(new Employes(), ...data.Employes); //Generate Classes automatically here from data type
        console.log(employes);
    })

有什么解决办法吗?

【问题讨论】:

  • 使Employee 类从您的响应中接受一个对象作为构造函数参数,然后构建该对象。类似let employee = new Employee(data.employees[0])
  • @IsaacVidrine 我假设Employes 是任意选择的并且可以代表任何字符串?也许OP可以确认。
  • 您希望它们仅具有与 employee 对象相同的属性还是实际上成为员工对象?
  • 在标准 OOP 语言中(不是在 javascript 术语中),您是否尝试基于 JSON 数据生成一个新类(可能是因为您不知道将调用哪些类),或者是您只是想即时实例化各种预定义类的对象?两者在 Javascript 中都相对容易——顺便说一下,它没有类(除了语法糖)——但算法会完全不同。
  • @Cat 我想根据 JSON 数据生成新类,例如在我的代码中,我在 json 上有 Employes 和 infos,所以我想在我的 js 代码上自动创建 Employes 和 infos 类

标签: javascript


【解决方案1】:

JS 本身并没有与大多数 OOP 语言相同的类。你可能有OOP背景,应该了解一下JS的prototype based inheritance。

您会明白您实际上不必创建这些类。您可以通过简单的写作来实现(我认为)您正在寻找的东西:

fetchJSONFile(function(data){ 
        employes = data.Employes; 
        // or, if you wish to make a copy
        //employes = data.Employes.map(e => {...e})
        console.log(employes);
    })

【讨论】:

  • Employes 和 Infos 类可能定义了方法。
  • 正如 OP 所说他们想自动生成这些类,我认为没有。我可能误解了这个问题
  • 嗯,我明白了。我认为考虑到他们正在调用 Employes 构造函数,它已经存在,他们只是不想显式引用它。但是在重新阅读问题后,我认为您是对的。无论哪种方式,我们都应该得到 OP 的澄清。
猜你喜欢
  • 1970-01-01
  • 2014-11-17
  • 2018-04-11
  • 2015-03-27
  • 1970-01-01
  • 2017-02-14
  • 2014-07-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多