Помогите пожалуйста распарсить 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'.)
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
В расширение используются переменные которые определяются только после полного загрузки DomКак сделать чтобы мой скрипт загружался только...