从 JSON 创建 TS class 实例时是否可以处理未知属性?
Is it possible to handle unknown properties when creating a TS class instance from JSON?
将普通对象从 JSON 转换为 class 实例时,我需要一种方法
捕获所有没有相应 class 属性的属性并存储它们
在某个地方(下面示例中的 additionalData)。
我调查了一些图书馆 (class-transformer, marshal.ts, TypedJSON)
但似乎没有办法做我想做的事。
下面是我想要实现的假设示例(它使用 class-transformer 但任何其他反序列化程序库都适用于我)
// model/DailyStatsRecord.ts
export class DailyStatsRecord {
public uuid: string;
public date: string;
public additionalData: any;
}
// index.ts
import "reflect-metadata";
import {plainToClass} from "class-transformer";
import {DailyStatsRecord} from './model/DailyStatsRecord';
const instance = plainToClass(DailyStatsRecord, {
uuid: "faf9a028-5bbe-11ea-bc55-0242ac130003",
date: "2020-03-01",
otherField: 123,
more: ["data"],
foo: "bar",
});
console.log(JSON.stringify(instance.additionalData, null, 2));
这是我希望此脚本输出的内容:
{
"otherField": 123,
"more": ["data" ],
"foo": "bar"
}
这可以在没有任何第三方库的情况下完成,但是您必须使用对象解构手动拉出已知属性,并为其他人收集休息,并让构造函数采用一个对象参数剩下的 key/values:
type POJO = {
[key: string]: any
};
class HasExtra {
public foo: string;
public bar: number;
public rest: POJO;
constructor(foo: string, bar: number, rest: POJO) {
this.foo = foo;
this.bar = bar;
this.rest = rest;
}
}
const dataFromJSON = {
foo: "hi",
bar: 3,
baz: true,
qux: null,
}
const {
foo,
bar,
...rest
} = dataFromJSON;
const instance = new HasExtra(foo, bar, rest);
console.log(instance.rest); // logs { baz: true, qux: null }
将普通对象从 JSON 转换为 class 实例时,我需要一种方法 捕获所有没有相应 class 属性的属性并存储它们 在某个地方(下面示例中的 additionalData)。
我调查了一些图书馆 (class-transformer, marshal.ts, TypedJSON) 但似乎没有办法做我想做的事。
下面是我想要实现的假设示例(它使用 class-transformer 但任何其他反序列化程序库都适用于我)
// model/DailyStatsRecord.ts
export class DailyStatsRecord {
public uuid: string;
public date: string;
public additionalData: any;
}
// index.ts
import "reflect-metadata";
import {plainToClass} from "class-transformer";
import {DailyStatsRecord} from './model/DailyStatsRecord';
const instance = plainToClass(DailyStatsRecord, {
uuid: "faf9a028-5bbe-11ea-bc55-0242ac130003",
date: "2020-03-01",
otherField: 123,
more: ["data"],
foo: "bar",
});
console.log(JSON.stringify(instance.additionalData, null, 2));
这是我希望此脚本输出的内容:
{
"otherField": 123,
"more": ["data" ],
"foo": "bar"
}
这可以在没有任何第三方库的情况下完成,但是您必须使用对象解构手动拉出已知属性,并为其他人收集休息,并让构造函数采用一个对象参数剩下的 key/values:
type POJO = {
[key: string]: any
};
class HasExtra {
public foo: string;
public bar: number;
public rest: POJO;
constructor(foo: string, bar: number, rest: POJO) {
this.foo = foo;
this.bar = bar;
this.rest = rest;
}
}
const dataFromJSON = {
foo: "hi",
bar: 3,
baz: true,
qux: null,
}
const {
foo,
bar,
...rest
} = dataFromJSON;
const instance = new HasExtra(foo, bar, rest);
console.log(instance.rest); // logs { baz: true, qux: null }