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

时间:2018-06-19 17:48:01

标签: 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解析仅传递值,甚至不自行初始化对象,知道吗?。

3 个答案:

答案 0 :(得分:2)

JSON.parse用于将有效的JSON字符串数据转换为JSON对象。它将不会将功能转换为JSON对象中的正常JavaScript功能。

请查看此链接以获取更多详细信息。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse

此外,如果您在具有一个或多个功能的现有对象上应用/调用此功能。它将用字符串来替换对象。

答案 1 :(得分:2)

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

  • Object.assign(new Foo, { a: 1 })
  • Object.setPrototypeOf({ a: 1 }, Foo.prototype)

答案 2 :(得分:1)

您可能想访问json.org,它对JSON的内容进行了非常紧凑的描述。

简而言之:

  • 对象(在键值对的意义上,因此它们是关联数组/地图/字典,但它们不是带有构造函数,方法等的“ OOP对象”)
  • 数组(值列表)
  • 字符串
  • 数字
  • true
  • false

“功能”不在列表中,JSON中没有功能。

您将需要一种变通方法,也许是another answer的建议或其他方法。


虽然我不了解TypeScript,但您可以从以下JavaScript示例中了解一些主意:

<html>
 <head></head>
 <body></body>
</html>

JSON.parse也有一个可选的第二个参数,它可以对从JSON恢复的所有“事物”进行转换。在上面示例的“ correctUser”部分中,将检查每个“事物”是否是对象,如果它是对象,则将其“投射”到UserObject并因此获得缺少的功能(尽管至少就我所知,JavaScript Object.assign使创建合适的对象并填充其字段变得简单,我认为您也需要在TypeScript中做同样的事情,因为type assertions说它们实际上并没有这样做物体的任何东西)。

问题在于这里每个对象都将是UserObject,因此,如果您有多个类,则必须以某种方式区分它们(也许通过检查它们具有的字段),并相应地创建替换对象。 / p>