我有这样的模型:
export default class UserObject
{
name: string;
id: string;
validateInsert()
{
}
}
如果我喜欢这样:
const modelUser: UserModel = new UserModel();
modelUser.ID = 1;
modelUser.Name = "Ibrahim Aziz";
modelUser.validateInsert();
一切正常,但如果我这样做:
modelUser = JSON.parse(stringJSONUser);
modelUser.validateInsert();
我会收到错误消息,说验证插入不是一个函数,似乎 JSON 解析只传递值,甚至不自己启动对象,知道吗?
最佳答案
您可能想访问json.org ,它对 JSON 的内容有非常简洁的描述。
简而言之:
- 对象(在键值对的意义上,因此它们是关联数组/映射/字典,但它们不是具有构造函数、方法等的“OOP对象”)
- 数组(值列表)
- 字符串
- 数字
- 真实
- 假
- 空
“function”不在列表中,JSON 中没有函数。
您将需要一个解决方法,也许是 another answer建议,或者其他什么。
<小时/> 虽然我不了解 TypeScript,但您可能会从以下 JavaScript 示例中得到一些想法:class UserObject{
constructor(name,id){
this.name=name;
this.id=id;
}
validateInsert(){
return this.name.length>0 && this.id!=0;
}
}
var originalUser=new UserObject("tevemadar",123);
console.log("original:",originalUser.name,originalUser.id,originalUser.validateInsert());
var json=JSON.stringify(originalUser);
console.log("json:",json);
var failUser=JSON.parse(json);
try{
console.log("fail:",failUser.name,failUser.id,failUser.validateInsert());
}catch(ex){
console.log("failUser failed:",ex.toString());
}
var correctUser=JSON.parse(json,function(key,value){
if(typeof value==='object')
return Object.assign(new UserObject,value);
return value;
});
try{
console.log("correctUser:",correctUser.name,correctUser.id,correctUser.validateInsert());
}catch(ex){
console.log("correctUser failed:",ex);
}
JSON.parse
还有一个可选的第二个参数,它可以对从 JSON 恢复的所有“事物”进行转换。在上面示例的“正确用户”部分中,检查每个“事物”是否是一个对象,如果它是一个对象,则将其“强制转换”为 UserObject,从而获得缺少的函数(虽然在中没有真正的强制转换)至少据我所知,JavaScript 使得创建一个合适的对象并填充其字段变得简单。我认为你也需要在 TypeScript 中做同样的事情,因为 Object.assign
说它们实际上并没有对对象做任何事情)。
问题是这里每个对象都将是 UserObject,因此如果您有多个类,您必须以某种方式告诉它们(也许通过检查它们具有哪些字段),并相应地创建替换对象。
关于javascript - JSON.parse 后对象中的函数不再是函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50934243/