如何在 nest.js 中重命名 JSON 字段
Posted
技术标签:
【中文标题】如何在 nest.js 中重命名 JSON 字段【英文标题】:How to rename JSON fields in nest.js 【发布时间】:2021-07-14 11:57:29 【问题描述】:我想知道为nest.js
中的反序列化程序重命名字段的正确方法是什么。对于下面的给定对象:
export class User
contact_email?: string;
contact_email
是我们数据库中的一个字段,但它与当前正在发送 contactEmail
的应用程序冲突。
我尝试了以下给定的解决方案:
import Expose from 'class-transformer';
export class User
@Expose( name: "contactEmail" )
contact_email?: string;
上面的这个完全重命名了字段,并且在使用对象时,它完全转换为contactEmail
,不仅在从 JSON(字符串)转换为 Class 时。然后我尝试了以下解决方案:
import Transform from 'class-transformer';
export class User
@Transform(key => "contactEmail", toClassOnly: true )
contact_email?: string;
这个案子好像也行不通。
来自应用程序的信息:
"contactEmail": "email@gmail.com"
我想做一些类似于 rust 的 serde #rename 的事情。我可以重命名序列化/反序列化的字段,但保留应用程序的原始名称。
我们正在使用nest.js + fastify.js + sequelize.js。
谢谢。
【问题讨论】:
我遇到了完全相同的问题佩德罗。文档建议@Expose(name:'')
应该可以工作:github.com/typestack/… - 但是唉。我也尝试了这种方法 - github.com/typestack/class-transformer/issues/527 没有运气。
【参考方案1】:
好的,经过一番挖掘,我有一个解决方法,但你会看到它是一只丑小鸭/黑客?:
@Expose()
@Transform(
(value, obj, type) =>
console.log(value, obj, type);
if (obj['contact_email'])
return obj['contact_email'];
else
return value;
)
contactEmail?: string;
这对你有用吗?
使用三元语句将其修剪一下:
@Expose()
@Transform(
(value, obj) =>
typeof value === 'undefined' ? obj['contact_email'] : value
)
contactEmail?: string;
我可能应该就class-transform
项目寻求澄清,因为我怀疑这不是故意的。
在将日志放入 @Transform
装饰器后,我注意到在第一次通过 value
时是 undefined
,但在第二次通过时它有一个值。
我知道它被调用了两次,我想一次是在调用 plainToClass
时,然后在序列化期间再次调用。
希望此解决方法对您有所帮助或推动问题。
【讨论】:
以上是关于如何在 nest.js 中重命名 JSON 字段的主要内容,如果未能解决你的问题,请参考以下文章