JSON.stringify()和JSON.parse()会改变数据类型吗?

3

我需要一点帮助更好地理解JSON。

当我将一个包含类对象的数组进行字符串化并解析回来时,数组似乎失去了类实例。我是否可以在解析JSON数据后仍然保留类,如果可以,如何做到?为什么会发生这种情况?

以下是代码:

class Account {
    constructor(site, login, pass) {
        this.site = site,
        this.login = login
        this.pass = pass
    }
}
const accounts = [
    new Account("website1.com", "email1@gmail.com", "12345"),
    new Account("website2.com", "email2@gmail.com", "23456")
]
console.log('BEFORE', accounts)


const string = JSON.stringify(accounts)
console.log(string)


const parseString = JSON.parse(string)
console.log('AFTER', parseString)

控制台显示如下:
BEFORE (2) [Account, Account]
{string: "[{"site":"website1.com","login":"email1@gmail.com"….com","login":"email2@gmail.com","pass":"23456"}]"}
AFTER (2) [{…}, {…}]


为了让事情更清楚,JSON.parse()后面是否可能有[Account, Account]?
如果我的解释不清楚,请告诉我。
非常感谢!

2
传递一个自定义的reviver参数,但请注意,这并不是一个特别健壮的API。 - undefined
3个回答

6

JSON不支持除了对象、数组、null、字符串、数字和布尔类型之外的其他类型。

如果你知道在你的JSON中需要什么类型,可以在解析时使用一个解析器函数。对于你的例子,这就足够了:

JSON.parse(string, (k, v) => v.hasOwnProperty('site')
                             ? new Account(v.site, v.login, v.pass)
                             : v);

0
从你的问题中我理解到,你想要将解析后的JSON字符串转换为你的账户对象原型。为了实现这一目标,你可以使用下面的代码,因为JSON.parse()返回的是JavaScript对象,我们需要将其显式地转换为我们自定义的对象原型(在你的情况下是Account)。
const string = JSON.stringify(accounts)
console.log(string);

const parseString = JSON.parse(string);

objectFromJson = function (parseString){
    var temp = [];
    for( var i = 0; i < parseString.length; i++) {
       temp.push(new Account (parseString[i].site, parseString[i].login, parseString[i].pass));
    }
    return temp;
};

var accountArray = objectFromJson(parseString);
console.log('AFTER', accountArray);

0
JavaScript有两个有用的方法来处理JSON格式的内容:JSON.stringify()和JSON.parse(),它们作为一对非常有用的方法需要学习。 JSON.stringify()将一个JavaScript对象转换成JSON字符串。 JSON.parse()将一个JSON字符串转换成JavaScript对象。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接