JSON.parse 后对象中的函数不再是函数

Bhi*_*bim 2 javascript rest json typescript angular

我有这样的模型:

export default class UserObject
{
    name: string;
    id: string;

    validateInsert()
    {

    }
}
Run Code Online (Sandbox Code Playgroud)

如果我喜欢这样:

const modelUser: UserModel = new UserModel();
modelUser.ID = 1;
modelUser.Name = "Ibrahim Aziz";
modelUser.validateInsert();
Run Code Online (Sandbox Code Playgroud)

一切工作正常,但如果我这样做:

modelUser = JSON.parse(stringJSONUser);
modelUser.validateInsert();
Run Code Online (Sandbox Code Playgroud)

我会收到错误消息,说 validate insert 不是一个函数,似乎 JSON 解析只传递值,甚至不启动它自己的对象,知道吗?

tev*_*dar 5

您可能想访问json.org,它对 JSON 的内容有非常简洁的描述。

简而言之:

  • 对象(在键值对的意义上,因此它们是关联数组/映射/字典,但它们不是具有构造函数、方法等的“OOP对象”)
  • 数组(值列表)
  • 字符串
  • 数字
  • 真的
  • 错误的
  • 无效的

“function”不在列表中,JSON 中没有函数。

您将需要一种解决方法,也许是另一个答案所建议的,或者其他什么。


虽然我不了解 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);
}
Run Code Online (Sandbox Code Playgroud)

JSON.parse还有一个可选的第二个参数,它可以对从 JSON 恢复的所有“事物”进行转换。在上面示例的“正确用户”部分中,检查每个“事物”是否是一个对象,如果它是一个对象,则将其“强制转换”为 UserObject,从而获得缺少的函数(虽然在中没有真正的强制转换)至少据我所知,JavaScriptObject.assign使得创建一个合适的对象并填充其字段变得简单。我认为你也需要在 TypeScript 中做同样的事情,因为类型断言说它们实际上并不对对象做任何事情。

问题是这里每个对象都将是 UserObject,因此如果您有多个类,您必须以某种方式告诉它们(也许通过检查它们具有哪些字段),并相应地创建替换对象。