moe*_*774 36 json typescript angular
我目前正在尝试将我收到的JSON对象转换为具有相同属性的TypeScript类,但我无法使其工作.我究竟做错了什么?
员工类
export class Employee{
firstname: string;
lastname: string;
birthdate: Date;
maxWorkHours: number;
department: string;
permissions: string;
typeOfEmployee: string;
note: string;
lastUpdate: Date;
}
Run Code Online (Sandbox Code Playgroud)
员工字符串
{
"department": "<anystring>",
"typeOfEmployee": "<anystring>",
"firstname": "<anystring>",
"lastname": "<anystring>",
"birthdate": "<anydate>",
"maxWorkHours": <anynumber>,
"username": "<anystring>",
"permissions": "<anystring>",
"lastUpdate": "<anydate>"
//I will add note later
}
Run Code Online (Sandbox Code Playgroud)
我的尝试
let e: Employee = new Employee();
Object.assign(e, {
"department": "<anystring>",
"typeOfEmployee": "<anystring>",
"firstname": "<anystring>",
"lastname": "<anystring>",
"birthdate": "<anydate>",
"maxWorkHours": 3,
"username": "<anystring>",
"permissions": "<anystring>",
"lastUpdate": "<anydate>"
});
console.log(e);
Run Code Online (Sandbox Code Playgroud)
Rod*_*igo 34
如果您使用TypeScript 接口而不是类,事情就更简单了:
export interface Employee {
typeOfEmployee_id: number;
department_id: number;
permissions_id: number;
maxWorkHours: number;
employee_id: number;
firstname: string;
lastname: string;
username: string;
birthdate: Date;
lastUpdate: Date;
}
let jsonObj: any = JSON.parse(employeeString); // string to generic object first
let employee: Employee = <Employee>jsonObj;
Run Code Online (Sandbox Code Playgroud)
但是,如果你想要一个类,简单的转换将不起作用.例如:
class Foo {
name: string;
public pump() { }
}
let jsonObj: any = JSON.parse('{ "name":"hello" }');
let fObj: Foo = <Foo>jsonObj;
fObj.pump(); // crash, method is undefined!
Run Code Online (Sandbox Code Playgroud)
对于类,您必须编写一个接受JSON字符串/对象的构造函数,然后遍历属性以手动分配每个成员,如下所示:
class Foo {
name: string;
constructor(jsonStr: string) {
let jsonObj: any = JSON.parse(jsonStr);
for (let prop in jsonObj) {
this[prop] = jsonObj[prop];
}
}
}
let fObj: Foo = new Foo(theJsonString);
Run Code Online (Sandbox Code Playgroud)
Nit*_*mer 30
编译器允许您将返回的对象强制JSON.parse
转换为类的原因是typescript基于结构子类型.
你没有真正的实例Employee
,你有一个具有相同属性的对象(如你在控制台中看到的那样).
一个更简单的例子:
class A {
constructor(public str: string, public num: number) {}
}
function logA(a: A) {
console.log(`A instance with str: "${ a.str }" and num: ${ a.num }`);
}
let a1 = { str: "string", num: 0, boo: true };
let a2 = new A("stirng", 0);
logA(a1); // no errors
logA(a2);
Run Code Online (Sandbox Code Playgroud)
(游乐场代码)
没有错误,因为它a1
满足类型,A
因为它具有所有属性,并且logA
可以调用该函数而不会出现运行时错误,即使它接收的内容不是A
具有相同属性的实例.
当你的类是简单的数据对象并且没有方法时,这很有用,但是一旦你引入了方法,那么事情往往会破坏:
class A {
constructor(public str: string, public num: number) { }
multiplyBy(x: number): number {
return this.num * x;
}
}
// this won't compile:
let a1 = { str: "string", num: 0, boo: true } as A; // Error: Type '{ str: string; num: number; boo: boolean; }' cannot be converted to type 'A'
// but this will:
let a2 = { str: "string", num: 0 } as A;
// and then you get a runtime error:
a2.multiplyBy(4); // Error: Uncaught TypeError: a2.multiplyBy is not a function
Run Code Online (Sandbox Code Playgroud)
(游乐场代码)
这很好用:
const employeeString = '{"department":"<anystring>","typeOfEmployee":"<anystring>","firstname":"<anystring>","lastname":"<anystring>","birthdate":"<anydate>","maxWorkHours":0,"username":"<anystring>","permissions":"<anystring>","lastUpdate":"<anydate>"}';
let employee1 = JSON.parse(employeeString);
console.log(employee1);
Run Code Online (Sandbox Code Playgroud)
(游乐场代码)
如果您在JSON.parse
对象上尝试使用它时不是字符串:
let e = {
"department": "<anystring>",
"typeOfEmployee": "<anystring>",
"firstname": "<anystring>",
"lastname": "<anystring>",
"birthdate": "<anydate>",
"maxWorkHours": 3,
"username": "<anystring>",
"permissions": "<anystring>",
"lastUpdate": "<anydate>"
}
let employee2 = JSON.parse(e);
Run Code Online (Sandbox Code Playgroud)
然后你会得到错误,因为它不是一个字符串,它是一个对象,如果你已经有了这个形式,那么就没有必要使用了JSON.parse
.
但是,正如我所写的那样,如果你采用这种方式,那么你将不会拥有该类的实例,只是一个与类成员具有相同属性的对象.
如果你想要一个实例,那么:
let e = new Employee();
Object.assign(e, {
"department": "<anystring>",
"typeOfEmployee": "<anystring>",
"firstname": "<anystring>",
"lastname": "<anystring>",
"birthdate": "<anydate>",
"maxWorkHours": 3,
"username": "<anystring>",
"permissions": "<anystring>",
"lastUpdate": "<anydate>"
});
Run Code Online (Sandbox Code Playgroud)
您的JSON数据具有您在课堂上没有的一些属性.用于映射您可以执行简单的自定义映射
export class Employe{ ////
static parse(json: string) {
var data = JSON.parse(json);
return new Employe(data.typeOfEmployee_id, data.firstName.. and others);
}
}
Run Code Online (Sandbox Code Playgroud)
并指定你的构造函数
雇员
类
let employee = <Employee>JSON.parse(employeeString);
Run Code Online (Sandbox Code Playgroud)
请记住:强类型只是编译时,因为 javascript 不支持它。