Angular2 отображение вложенного массива json в модель

Я не могу сопоставить вложенный массив json, который является ответом Из интернета на мой массив модели в Angular2. Предположим, у меня есть ответ массива JSON, как показано ниже:

[{
    "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"
}]

Я пытался вручную сопоставить поля, ссылаясь на ссылку Angular 2 observable не "сопоставляет" модель к моей модели и смог отобразить их в моем HTML, выполнив итерацию через ngFor.....но я хочу также отобразить значение ncloc и строк также в HTML, но я не уверен, как сопоставить эти значения к моему массиву моделей, как указано в приведенной выше ссылке. Не могли бы вы помочь мне с этим?

спасибо.

редактировать

класс режим

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));
    } 
 } 

1 ответов


вы можете упростить свою модель и ваше отображение много. Вам не нужно сопоставлять свой ответ API вручную. JavaScript/TypeScript может сделать это за вас.

сначала вам нужно несколько интерфейсов.

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;
 }

затем вы можете использовать as-"оператор"машинопись для приведения ответа API к типу DeiInstance.

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

Если вы используете интерфейсы вместо классов, у вас также есть преимущество, что у вас меньше производственного кода, который будет быть отправлено в клиентский браузер. Интерфейс существует только для предварительного времени компиляции или как вы хотите его назвать.

надеюсь, что мой код работает, и это решит вашу проблему.