2016-12-05 40 views
5

Tôi không thể ánh xạ mảng json lồng nhau là phản hồi từ Web đến mảng mô hình của tôi trong Angular2. Giả sử tôi có phản ứng mảng json như sau:Angular2 Ánh xạ mảng json lồng nhau thành mô hình

[{ 
    "base_url": "http://mysearch.net:8080/", 
    "date": "2016-11-09", 
    "lname": "MY PROJ", 
    "name": "HELLO", 
    "description": "The Test Project", 
    "id": 10886789, 
    "creationDate": null, 
    "version": "2.9", 
    "metrics": [{ 
     "val": 11926.0, 
     "frmt_val": "11,926", 
     "key": "lines" 
    }, 
    { 
     "val": 7893.0, 
     "frmt_val": "7,893", 
     "key": "ncloc" 
    }], 
    "key": "FFDFGDGDG" 
}] 

Tôi đã cố gắng tự lập bản đồ các lĩnh vực đề cập vào liên kết Angular 2 observable doesn't 'map' to model để mô hình của tôi và đã có thể hiển thị những người trong HTML của tôi bằng cách duyệt qua ngFor ..... nhưng Tôi cũng muốn hiển thị giá trị ncloc và dòng cũng trong HTML nhưng tôi không chắc chắn làm thế nào để ánh xạ các giá trị đó vào mảng Mô hình của tôi như đã đề cập trong liên kết ở trên. Bạn có thể giúp tôi với điều này không?

Cảm ơn.

EDIT

Chế độ lớp

export class DeiInstance { 
    base_url: string; 
    date: string; 
    lname : string; 
    name : string; 
    id : number; 
    key:string; 

    constructor(obj: DeiInstance) { 
     this.sonar_url = obj['base_url']; 
     this.lname = obj['lname']; 
     this.name = obj['name']; 
     this.id = obj['id']; 
     this.key = obj['key']; 
     this.date = obj['date']; 
    } 

    // New static method. 
    static fromJSONArray(array: Array<DeiInstance>): DeiInstance[] { 
     return array.map(obj => new DeiInstance(obj)); 
    } 
} 
+0

Bạn có mã nhiều hơn về ánh xạ hiện tại và Mô hình hiện tại không? – M4R1KU

+0

Đây là Mô hình của tôi: lớp xuất khẩu DeiInstance { base_url: string; ngày: chuỗi; lname: string; tên: chuỗi; id: number; khóa: chuỗi; hàm tạo (obj: DeiInstance) { this.sonar_url = obj ['base_url']; this.lname = obj ['lname']; this.name = obj ['name']; this.id = obj ['id']; this.key = obj ['key']; this.date = obj ['date']; } // Phương pháp tĩnh mới. tĩnh từJSONArray (mảng: Mảng ): DeiInstance [] { trả về mảng.map (obj => new DeiInstance (obj)); } } – PingPong

+0

@ M4R1KU Và tôi đang lặp qua listProjects được định nghĩa là DeiInstance [] trong thành phần của tôi để hiển thị các trường trong HTML của tôi – PingPong

Trả lời

15

Bạn có thể đơn giản hóa mô hình của bạn và lập bản đồ của bạn rất nhiều. Bạn không cần ánh xạ phản hồi API của mình theo cách thủ công. JavaScript/TypeScript có thể làm điều này cho bạn.

Trước tiên, bạn cần nhiều giao diện.

export interface DeiInstance { 
    base_url: string; 
    date: string; 
    lname: string; 
    name: string; 
    description: string; 
    id: number; 
    creationDate: string; //probably date 
    version: string 
    metrics: Metric[]; 
    key: string; 
} 

export interface Metric { 
     val: decimal; 
     frmt_val: decimal; 
     key: string; 
} 

Sau đó bạn có thể sử dụng as - "điều hành" của nguyên cảo để cast phản ứng API của bạn để Type DeiInstance.

sealSearch(term: string): Observable<DeiInstance[]> { 
     return this.http.get(this.sealUrl + term) 
      .map(response => response.json() as DeiInstance[]) 
      .catch(this.handleError); 
} 

Nếu bạn sử dụng giao diện thay vì các lớp, bạn cũng có lợi thế là bạn có ít mã sản xuất hơn sẽ được sử dụng cho trình duyệt của khách hàng. Giao diện chỉ có sẵn cho thời gian biên dịch trước hoặc tuy nhiên bạn muốn gọi nó.

Hy vọng mã của tôi hoạt động và giải quyết được sự cố của bạn.

+0

Cảm ơn bạn rất nhiều @ M4R1KU. Nó làm việc cho tôi. Nếu tôi nhận được thêm bất kỳ nghi ngờ hoặc tôi bị mắc kẹt hơn nữa tôi sẽ liên lạc với bạn. Cảm ơn rất nhiều !!! – PingPong

+0

@RoshDesh rất hay khi nghe điều đó. i woul cũng đánh giá cao nếu bạn đánh dấu câu trả lời của tôi là giải pháp cho vấn đề yozr; D – M4R1KU

Các vấn đề liên quan