如何在 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 字段的主要内容,如果未能解决你的问题,请参考以下文章

如何在JSON中重命名密钥

如何使用 pymongo 在 mongodb 中重命名父字段名称和嵌套字段值?

在 node.js 中重命名 json 对象名称

如何在 Vega Lite 中重命名图例标签?

在 Rails JSON 序列化中重命名模型关联属性?

如何在Android中重命名文件只知道它的媒体内容Uri