数据库和返回的对象数组

时间:2018-04-21 12:31:29

标签: javascript

我想要存储到数据库的函数/对象数组,如下例所示:

function classPerson(firstName, lastName, activeStatus) {
    this.firstName = firstName;
    this.lastName = lastName;
    this.activeStatus = activeStatus;
    this.identify = function () {
        return this.firstName + " " + this.lastName;
    }
} // element

var persons = [];
var personsFromDatabase = [];

// define persons
var personOne = new classPerson('Bruce', 'Lee', true);
var personTwo = new classPerson('Chuck', 'Norris', false);
var personThree = new classPerson('Steven', ' Seagal', true);

// add persons to array
persons.push(personOne);
persons.push(personTwo);
persons.push(personThree);

// show persons data
for (var i = 0; i < persons.length; i++) {
    alert(persons[i].identify());    
}

// store to database
var toDatabase = JSON.stringify(persons);        
alert(toDatabase);

// retrieve from database
var personsFromDatabase = JSON.parse(toDatabase);

// show persons data parsed from database
for (var i = 0; i < personsFromDatabase.length; i++) {
    alert(personsFromDatabase[i].identify());    
}

我使用JSON.stringify命令将people数组转换为字符串,并成功将其存储到数据库中。 当我从数据库加载相同的字符串并使用JSON.parse转换回JS函数/对象时,我得到简单对象的列表(和错误

  

TypeError:personsFromDatabase [i] .identify不是函数

)而不是classPerson函数/对象,在控制台中我可以看到差异,如下图所示: Console view

如何实现获取函数/对象数组而不是简单的JS对象?

Fiddler link with example

2 个答案:

答案 0 :(得分:1)

您无法在JSON中保存函数,因为JSON中不存在函数 但是你可以使用stringify函数的第二个参数来替换带有值的函数。

喜欢

var json = JSON.stringify(obj, function(key, value) {
  if (typeof value === 'function') {
    return value.toString();
  } else {
    return value;
  }
});

答案 1 :(得分:1)

如上所述,JSON没有数据类型的功能。您只能序列化字符串,数字,对象,数组和布尔值(以及null):

我更改了您的示例以提供序列化和反序列化的方法 - 可以作为基本模板:

    function ClassPerson(firstName, lastName, activeStatus) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.activeStatus = activeStatus;
        this.identify = function () {
            return this.firstName + " " + this.lastName;
        }
    } // element

    ClassPerson.prototype.toJson = function() {
        var data = {};
        for(var prop in this) {
            if(this.hasOwnProperty(prop) && (typeof this[prop] !== 'function')) {
                data[prop] = this[prop];
            }
        }
        return JSON.stringify(data);
    };

    ClassPerson.fromJson = function(json) {
        var data = JSON.parse(json); // Parsing the json string.
        if(data) {
            var firstName = data.hasOwnProperty('firstName') ? data.firstName : "";
            var lastName = data.hasOwnProperty('lastName') ? data.lastName : "";
            var activeStatus = data.hasOwnProperty('activeStatus') ? data.activeStatus : "";
            return new ClassPerson(firstName, lastName, activeStatus);
        }
        return {};
    };

    function serializeClassPersons(personArray) {
        var serialised = [];
        for (var i = 0; i < personArray.length; i++) {
            serialised.push(persons[i].toJson());
        };
        return JSON.stringify(serialised);
    };
    function deserializeClassPersons(personsJsonString) {
        var jsonStringArray = JSON.parse(personsJsonString); // this is an array
        var persons = [];
        for (var i = 0; i < jsonStringArray.length; i++) {
            persons.push(ClassPerson.fromJson(jsonStringArray[i]));
        };
        return persons;
    };


    // add persons to array
    var persons = [
        new ClassPerson('Bruce', 'Lee', true),
        new ClassPerson('Chuck', 'Norris', false),
        new ClassPerson('Steven', ' Seagal', true)
    ];
    var personsFromDatabase = [];

    // show persons data
    console.log('Using ClassPerson.identify():');
    for (var i = 0; i < persons.length; i++) {
        console.log(persons[i].identify());
    };

    console.log('Using ClassPerson toJson() and fromJson()');
    for (var i = 0; i < persons.length; i++) {
        var jsonPerson = persons[i].toJson();
        console.log("json", jsonPerson);
        var personFromJson = ClassPerson.fromJson(jsonPerson);
        console.log("identify: ", persons[i].identify());
    };

    console.log('Serialize Persons Array to Json String');
    var personsJson = serializeClassPersons(persons);
    console.log(personsJson);

    console.log('DeSerialize Json Persons String to Array');
    var personsFromDatabase = deserializeClassPersons(personsJson);
    console.log(personsFromDatabase);

输出结果为:

Chrome Debug