【问题标题】:Function in object become not a function after JSON.parseJSON.parse 之后对象中的函数不再是函数
【发布时间】:2018-11-28 18:17:27
【问题描述】:

我有模型可以这样说:

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();

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

【问题讨论】:

  • 你能发一个stringJSONUser中包含的数据的例子吗?

标签: javascript json angular rest typescript


【解决方案1】:

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

请查看此链接了解更多详情。

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

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

【讨论】:

  • 我要做的是将值映射到对象,然后使用内部预定义的函数,而不是解析函数。在 .net 中,这可以通过反序列化对象或在 android 中实现,所以我想我需要在内部手动映射:(。
【解决方案2】:

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

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

【讨论】:

  • 哦,我在重新发明自己之前没有注意到这一点:s
【解决方案3】:

您可能想访问json.org,它对 JSON 的功能进行了非常简洁的描述。

简而言之:

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

“函数”不在列表中,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);
}

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 至少据我所知,Object.assign 使创建适当的对象并填充其字段变得简单。我认为您也需要在 TypeScript 中做同样的事情,因为type assertions 说他们实际上并没有对对象做任何事情)。

关键是这里的每个对象都将是 UserObject,所以如果你有多个类,你必须以某种方式将它们分开(可能通过检查它们有哪些字段),并相应地创建替换对象。

【讨论】:

  • 我要做的是将值映射到对象,然后使用内部预定义的函数,而不是解析函数。在 .net 中,这可以通过反序列化对象或在 android 中实现,所以我想我需要在内部手动映射:(。
  • @Bhimbim 我刚刚通过可能的解决方法扩展了答案
猜你喜欢
  • 2015-08-12
  • 2018-04-02
  • 2012-02-06
  • 2016-02-19
  • 1970-01-01
  • 2014-01-31
  • 1970-01-01
  • 1970-01-01
  • 2015-08-11
相关资源
最近更新 更多