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
是唯一要展平的 属性,您可以同时使用 Expose
和 Transform
。
@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;
我正在尝试在 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
是唯一要展平的 属性,您可以同时使用 Expose
和 Transform
。
@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;