javascript 对象中的函数在JSON.parse之后变为非函数

sq1bmfud  于 2023-01-01  发布在  Java
关注(0)|答案(3)|浏览(163)

我有模特儿让这样说:

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解析只传递值,甚至没有启动它自己的对象,任何想法?

ehxuflar

ehxuflar1#

您可能想访问json.org,它对JSON有一个非常简洁的描述。
简而言之:

  • 对象(在键-值对的意义上,所以它们是关联数组/Map/字典,但它们不是具有构造函数、方法等的"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恢复的"things"进行转换。在上面示例的"correctUser"部分,每个"things"都被检查是否是对象,如果是对象,它就被"强制转换"为UserObject,从而获得缺少的函数(虽然至少据我所知,JavaScript中没有真正的强制转换,但Object.assign使创建适当的对象和填充其字段变得简单。我认为您也需要在TypeScript中做同样的事情,因为类型Assert说它们实际上不对对象做任何事情)。
问题是这里的每个对象都是UserObject,所以如果你有多个类,你必须以某种方式区分它们(也许通过检查它们有什么字段),并相应地创建替换对象。

toe95027

toe950272#

parse用于将有效的JSON字符串数据转换为JSON对象。它不会将函数转换为JSON对象中的JavaScript函数。
请看看这个链接了解更多详情。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse
同样,如果你用一个或多个函数在一个已有对象上应用/调用这个函数,它会用一个字符串对象替换已有对象。

cpjpxq1n

cpjpxq1n3#

你可以看看这个问题:Parse JSON String into a Particular Object Prototype in JavaScript,其中接受的答案建议用途:

  • 第一个月
  • Object.setPrototypeOf({ a: 1 }, Foo.prototype)

相关问题