Как распарсить сложный json?

297
06 марта 2017, 12:16

Помогите пожалуйста распарсить json. Сначала опишу рабочий пример для простого json, а потом нерабочий пример для сложного json. Решить нужно второй пример

Eсть следующий сомпонент app.component.ts:

import { Component } from '@angular/core';
import { Response} from '@angular/http';
import { HttpService} from './http.service';
import {User} from './user';
@Component({
  selector: 'app-root',
  template: `
                <h1>{{title}}</h1>
                <div>
                    <p>Имя пользователя: {{user?.name}}</p>
                    <p>Возраст пользователя: {{user?.age}}</p>
                </div>
  `,
  styles: [`* {color: red}`], 
  providers: [HttpService]
})
export class AppComponent { 
    title = 'app works!';   
    user: User;
    constructor(private httpService: HttpService){}
    ngOnInit(){
        this.httpService.getData().subscribe((data: Response) => this.user=data.json());
    }
}

В него подключен сервис http.service:

import {Injectable} from '@angular/core';
import {Http} from '@angular/http';
@Injectable()
export class HttpService{     
    getData(){
        return this.http.get('user.json')
    }
}
И кастомный тип данных user.ts:
console.log('user class');
export class User{
    name: string;
    age: number;
}

Источник данных user.json:

{
    "name": "Bob",
    "age": 28
}

Всё вышеописанное работает - выодит на экран следующее:

app works! Имя пользователя: Bob Возраст пользователя: 28

Теперь я хотел бы усложнить задачу и распарсить следующий user.json:

{   "headers": {
    "title":{"title":"Заголовок","type":"text"},
    "description":{"title":"Описание","type":"text"},
    "poster":{"title":"Изображение","type":"file"}   },   "values":{
    "id1": {"title":"Lorem ipsum dolor sit.", "poster": "images/1.jpg", "description": "Lorem ipsum dolor sit amet, consectetur adipis!"},
    "id2": {"title":"Nobis delectus deleniti, amet.", "poster": "images/2.jpg", "description": "Fuga, porro, nemo. Ut, nisi reicien"},
    "id3": {"title":"Sequi alias, cumque at.", "poster": "images/3.jpg", "description": "Architecto, placeat! Cum perferendis."},
    "id4": {"title":"Odit tempora tempore error.", "poster": "images/4.jpg", "description": "Ducimus velit culpa itaque eum libero."}   } }

Для чистоты задачи допустимо ограничиться только парсом "values".

У меня сложности возникают уже на этапе создания кастомного типа данных под этот новый json:

export class User{
    headers: {};
    values: {};
}

Вот моя версия компонента app.component.ts:

import { Component } from '@angular/core';
import { Response} from '@angular/http';
import { HttpService} from './http.service';
import {User} from './user';
@Component({
  selector: 'app-root',
  template: `
                <h1>{{title}}-{{user?}}</h1>
                <div>
                    <p>Имя пользователя: {{user?.name}}</p>
                    <p>Возраст пользователя: {{user?.age}}</p>
                </div>
  `,
  styles: [`* {color: red}`], 
  providers: [HttpService]
})
export class AppComponent { 
    title = 'app works!';   
    user: User;
    constructor(private httpService: HttpService){}
    ngOnInit(){
        this.httpService.getData().subscribe((data: Response) => this.user=data.json());
        console.log(this.user.values);
    }
}

В результате в консоль браузера выводится undefined. А CLI выводит:

ERROR in /home/kalinin/angular2/news-feed/src/app/app.component.ts (27,31): Property 'values' does not exist on type 'User'.)

READ ALSO
Как сделать так чтобы расширение Chrome подгружалось после загрузки Dom страницы?

Как сделать так чтобы расширение Chrome подгружалось после загрузки Dom страницы?

В расширение используются переменные которые определяются только после полного загрузки DomКак сделать чтобы мой скрипт загружался только...

258
Почему не работает JQuery UI аккордеон?

Почему не работает JQuery UI аккордеон?

Изучаю JSПытаюсь сделать аккордион с помощю JQuery UI

368
Не отправляется запрос на сервер

Не отправляется запрос на сервер

Не получается отправить post запросТекст ошибки:

281