【问题标题】:Typescript : JSON to Typescript Object打字稿:JSON 到打字稿对象
【发布时间】: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


【解决方案1】:

其他答案都是正确的。您应该考虑使用 3-d 方库进行正确的 typescript class-json 序列化,例如 https://www.npmjs.com/package/ts-jackson

【讨论】:

    【解决方案2】:

    如果您使用 JSON.Parse 从 JSON 到 Person 对象,则不会创建 Person 对象的原型。这意味着,如果您在 Person 对象上添加了一个 getter,例如,您将无法访问它,因为它在 JSON 上不可用。您需要做的是创建一个新的 Person 对象并映射 JSON 中的每个属性。

    有一些库用于将 JSON 序列化/反序列化为 Object(Person 类)。签出下面的库供您参考。

    https://www.npmjs.com/package/@peerlancers/json-serialization

    【讨论】:

    • 欢迎提供解决方案链接,但请确保您的答案在没有它的情况下有用:add context around the link 这样您的其他用户就会知道它是什么以及为什么会出现,然后引用最相关的您链接到的页面的一部分,以防目标页面不可用。 Answers that are little more than a link may be deleted..
    • 感谢@Alessio 的提示,非常感谢。我已经更新了我的答案。
    猜你喜欢
    • 2021-01-26
    • 2018-12-12
    • 1970-01-01
    • 2017-06-12
    • 2017-02-18
    • 1970-01-01
    • 1970-01-01
    • 2018-07-23
    • 1970-01-01
    相关资源
    最近更新 更多