2

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

我想仅使用 1 个模型来扁平化 JSON,1 个 Dto 将进入数据库

如果我有以下 json :

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

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

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

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

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

测试字段的结果未定义我该如何实现?我不想创建一个“中介”模型

4

3 回答 3

2

您正在尝试展平 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 函数,但您可以将其变成一个函数。
如果嵌套的 Object 是一个数组,这可能不起作用。你必须做额外的检查。

编辑:- 如果嵌套对象是数组,则将 if 条件更改为此

   if (typeof myObj[key] == "object" && !Array.isArray(myObj[key])){
        const nestedObj = Flatten(myObj[key]);
        Object.assign(newObj,nestedObj);
    }else{
       
        newObj[key] = myObj[key];
    }
于 2020-11-08T12:58:38.620 回答
1

根据文档制作

@Expose()
@Transform(({obj}) => obj.data.test)
test: string;
于 2021-04-18T15:20:38.770 回答
1

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

@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;

于 2021-01-02T14:57:32.500 回答