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

标签 javascript json angular rest typescript

我有这样的模型:

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/

相关文章:

javascript - 外部开发人员可以在运行时访问闭包变量吗?

javascript - Vuejs - 更改从外部选择中的选定选项

javascript - d3.js voronoi 事件。当光标正好位于点上方时,鼠标悬停似乎消失

ios - 使用 RestKit 为我的对象获取 JSON 字符串

python - 如何忽略 ply.yacc 中的标记

Angular Service Worker - 无法加载资源 : the server responded with a status of 504 (Gateway Timeout)

javascript - 反转div后面的颜色?

json - 在显示 View 之前未读取 View 模型数据

node.js - 属性 proxyConfig 是不允许的。 Angular

javascript - 过滤对象数组,其中对象中的一个字段是数组