【发布时间】:2023-03-07 02:25:01
【问题描述】:
我只想反序列化从我的服务器 API 获取的 JSON。
对于那里提到的大多数解决方案(不使用任何第三方库),看起来问题已经解决了。 例如,此 SO 线程上投票最多的答案:HERE
但我观察到的警告是,当 json 响应中有一些我不期望的额外属性时,行为不是我所期望的。
举个例子:
class Person {
id: number;
name: string;
}
let jsonString = `{
"id": 1,
"name": "sumit",
"age": 23
}`;
let person: Person = Object.assign(new Person(), JSON.parse(jsonString));
console.log(Object.keys(person));
console.log(JSON.stringify(person));
所以当我稍后使用“person”对象时,我希望它只包含 Person 类中提到的那些属性,毕竟“person”属于“Person”类型。 但令人惊讶的是,在序列化 person 时,它包含那些不在 Person 类中的额外属性。这里是“年龄”
上面的输出是:
["id", "name", "age"]
{"id":1,"name":"sumit","age":23}
现在,我如何确保在反序列化之后,对象“person”没有任何额外的属性。
【问题讨论】:
-
我认为您对 TypeScript 的工作原理感到困惑。它只是一个编译时类型系统(和转译器)。在运行时不存在或强制执行输入信息。您必须自己确保返回的 JSON 具有正确的形状,或者使用某种基于模式的验证库,或者找到一个智能序列化/反序列化库。
-
@torazaburo 非常感谢。您的信息促使我对 TypeScript 进行了一些研究,并且我发现我期待 TypeScript 提供一些不是为它而设计的东西。像 TypeScript 接口这样的结构在运行时甚至不存在于 Javascript 中。所以我最终使用 TypedJSON (github.com/JohnWeisz/TypedJSON) 库进行序列化/反序列化,以便运行时的行为符合我的预期。
-
为什么不直接转换 JSON 对象?: let person: Person =
JSON.parse(jsonString)) -
@yoonjesung 是的,你可以这样做,但问题是,假设你的 jsonString 中有一些额外的属性,这些属性在你的“Person”界面中不存在,在运行时你会假设你有一个“Person”类型的对象,但是一旦你序列化这个对象,它将包含那些额外的属性。因此,序列化“Person”类型的对象不仅仅是您所期望的。
标签: json typescript serialization casting deserialization