Typescript - 使用 Class-transformer 扁平化 JSON 模型

Typescript - flat a JSON model using Class-transformer

我正在尝试在 typescript (node.js) 中使用 class 转换器: https://github.com/typestack/class-transformer

我想仅使用 1 个模型和 1 个将转到数据库的 Dto 来平整 JSON

如果我有以下 json :

{
 "data":{"test":"123"}
 "name":"x"
}

数据库服务应接收以下对象:

 {
   "test":"123",
   "name":"x"
 }

这是我试图定义的,但它不起作用:

@Expose()
export class Dto{
  name:string,
  @Expose({name: "data.test"})
  test: string
}

测试字段的结果未定义 我怎样才能做到这一点?我不想创建“中介”模型

您正试图压平一个 JSON 对象,对吗?我认为你应该手动完成。像这样

function Flatten(myObj){
    const keys = Object.keys(myObj);
    const newObj = {};
    keys.forEach((key)=>{
        if (typeof myObj[key] != "object"){
            newObj[key] = myObj[key];
        }else{
            const nestedObj = Flatten(myObj[key]);
            Object.assign(newObj,nestedObj);
        }
    });
    return newObj;
}

备注:
这不是 TypeScript 函数,但您可以将其转换为一个函数。
如果嵌套对象是一个数组,这可能不起作用。你必须做额外的检查。

Edit:- 如果嵌套对象是数组,将 if 条件更改为 this

   if (typeof myObj[key] == "object" && !Array.isArray(myObj[key])){
        const nestedObj = Flatten(myObj[key]);
        Object.assign(newObj,nestedObj);
    }else{
       
        newObj[key] = myObj[key];
    }

或者,如果 data.test 是唯一要展平的 属性,您可以同时使用 ExposeTransform

@Expose({ name: 'data', toClassOnly: true })
@Transform((val) => val.test; }, { toClassOnly: true })
test: string;

如果没有

@Expose({ toClassOnly: true })
@Transform((val) => val.data.test; }, { toClassOnly: true })
test: string;

@Expose({ toClassOnly: true })
@Transform((val) => val.data.anothertest; }, { toClassOnly: true })
anothertest: string;

根据doc制作

@Expose()
@Transform(({obj}) => obj.data.test)
test: string;