2016-02-19 21 views
7

Làm cách nào để phân tích cú pháp đối tượng json phức tạp bằng TypeScipt?Phân tích các đối tượng json phức tạp với TypeScript

Tôi có đối tượng khách hàng, người có một số hóa đơn.

Đây là mô hình của tôi:

export class Customer { 
    public id: string; 
    public name: string; 
    public invoices: CustomerInvoice[]; 

    get invoicesCount(): number { 
     if (this.invoices== null) { 
      return 0; 
     } 
     return this.invoices.length; 
    } 

    constructor() { 
    } 
} 

export class CustomerInvoice { 
    public id: number; 

    constructor() { 
    } 
} 

Và phục vụ của tôi, tôi có:

ngOnInit() { 
    if (this.id != null) { 
     this.dataService.getCustomer(this.id).subscribe(data => { 
      this.customer = data; 
     }, 
      err => console.log(err)); 
    } 
} 

dữ liệu khách hàng là tuyệt vời (id khách hàng của tôi, tên vv có một số giá trị) nhưng hoá đơn là null .

Json đúng, dữ liệu.Invoices.length trả về một số.

+1

Không đủ chi tiết. – dfsq

Trả lời

8

Làm cách nào để phân tích cú pháp đối tượng json phức tạp bằng TypeScipt?

Giả sử bạn có nghĩa là phân tích cú pháp JSON vào trường lớp học thực tế thay vì các đối tượng Javascript đơn giản, nguyên cảo không xuất xưởng tính năng này off-the-shelf.

Bạn có thể tạo ra một tuyên bố giao diện sử dụng mà bạn có thể làm một type-assertion (không phải là một loại- đúc) để hơi mimick loại an toàn nếu JSON là đáng tin cậy, nhưng đó là nó - Tôi biết không có công cụ bản địa để tuần tự hóa JSON thành các phiên bản thực tế của các loại do người dùng định nghĩa.

interface ICustomerInvoice { 
    id: number; 
} 

interface ICustomer { 
    id: string; 
    name: string; 
    invoices: ICustomerInvoice[]; 
} 

var customer: ICustomer = JSON.parse(json) as ICustomer; 

Tuy nhiên, vì những lý do rõ ràng cùng tôi bắt đầu đặt lại với nhau TypedJSON để giới thiệu tính năng này vào nguyên cảo. Bạn có thể chú thích các lớp học và các thành viên của bạn với JSONObject và JsonMember trang trí:

@JsonObject 
export class CustomerInvoice { 
    @JsonMember 
    public id: number; 
} 

@JsonObject 
export class Customer { 
    @JsonMember 
    public id: string; 

    @JsonMember 
    public name: string; 

    @JsonMember({ elementType: CustomerInvoice }) 
    public invoices: CustomerInvoice[]; 

    get invoicesCount(): number { 
     if (this.invoices== null) { 
      return 0; 
     } 
     return this.invoices.length; 
    } 
} 

Để deserialize một JSON-string, bạn sẽ sử dụng TypedJSON.parse thay vì JSON.parse, các getter cũng sẽ có mặt như mong đợi:

var customer = TypedJSON.parse(json, Customer); 
typeof customer.invoicesCount; // "number"  

Đó là được đề xuất để sử dụng với ReflectDecorators (nhưng không bắt buộc). Nếu bạn chọn bỏ qua đề xuất này, bạn cũng cần chỉ định cài đặt 'loại' cho các thành viên, ví dụ:

@JsonMember({ type: String }) 
public id: string; 
Các vấn đề liên quan