如何将 JSON 数据加载到 Angular 中的类或类数组中?

Posted

技术标签:

【中文标题】如何将 JSON 数据加载到 Angular 中的类或类数组中?【英文标题】:How to load JSON data into a class or array of classes in Angular? 【发布时间】:2019-05-20 08:47:03 【问题描述】:

基本上我想要的是将我的 JSON 响应加载到一个类数组中,但是随着 Angular http 被弃用,我在 HttpClient 上遇到了一些问题,我见过的所有其他版本都使用 .map 方法不再存在(仅在管道之后)。

我的 JSON 响应如下所示:


  "list": [
    
      "Id": 1002469,
      "Summary": null,
      "StartDate": "2018-12-11T23:00:00",
      "EndDate": "2018-12-31T23:00:00",
...

我有两个类,一个 ListSearch 和一个 List 类。

以下是我的 API 请求代码:

getList() 
    return this.http.get('http://127.0.0.1:5002/list/' + this.token)
    ;
  

this.apisService.getList()
      .subscribe((list: any) => 
        this.listSearch = list;
        console.log(list);
        ,
        error => console.log('Error.')
      );

这完美地打印出我的响应 JSON。但是当我尝试将所有这些放入一个类或数组中时,它将是未定义的,或者它会获取如下数据:

ListSearch 0: "", 1: "
", 2: "↵", 3: " ", 4: " ", 5: """, 6: "l", 7: "i", 8: "s", 9: "t", 10: """, 11: ":", 12: " ", 13: "[", 14: "
", 15: "↵", 16: " ", 17: " ", 18: " ", 19: " ", 20: "", 21: "
", 22: "↵", 23: " ", 24: " ", 25: " ", 26: " ", 27: " ", 28: " ", 29: """, 30: "I", 31: "d", 32: """, 33: ":", 34: " ", 35: "1", 36: "0", 37: "0", 38: "2", 39: "4", 40: "6", 41: "9", 42: ",", ...

上面结果的代码:

this.apisService.getList()
      .subscribe((list: ListSearch) => 
        const a = new ListSearch().deserialize(list);
        console.log(a);
        ,
        error => console.log('Error.')
      );

你有什么建议我该如何做这个工作?

更新:

制作了以下接口(使用这个:https://jvilk.com/MakeTypes/):

export interface List 
    list?: (ListEntity)[] | null;
  
  export interface ListEntity 
    Id: number;

并且下面的代码仍然返回undefined ...

this.apisService.getList()
  .subscribe((list: ListSearch) => 

    console.log(list.list);

更新 2:

以下代码返回json的第一个字符“

this.apisService.getList()
      .subscribe((list: List[]) => 

        console.log(list[0]);
...

更新3:

我想我已经接近正确了:

  this.apisService.getList()
  .subscribe((data: ListSearch) => this.listSearch = 
    list: data['list']
    ,

它现在返回:

list: undefinedlist: undefined__proto__: Objectconstructor: ƒ ...

****************** 解决方案: ******************

终于! 我创建了一个简单的对象:

a: Object;

然后执行以下操作:

this.apisService.getList()
    .subscribe((data: string) => 
        this.a = JSON.parse(data);
        this.listSearch = <List>this.a;

它就像一个魅力!

【问题讨论】:

【参考方案1】:

由于您的 JSON 文件以 开头,因此 HTTPClient 将其作为单个对象读取。修改服务代码如下:

getList() 
    return this.http.get('http://127.0.0.1:5002/list/' + this.token);
  

this.apisService.getList()
  .subscribe((list: any) => 
    this.listSearch = list.list;
    console.log(list);
    ,
    error => console.log('Error.')
  );

【讨论】:

谢谢,但如果我尝试用“this.listSearch”做某事,它会说它“未定义”。 也试过了:.subscribe((list: any) =&gt; this.listSearch = list; console.log(this.listSearch); this.listSearch.list.forEach(element =&gt; console.log(element.Id); ); 但返回了下一个错误:ERROR TypeError: Cannot read property 'forEach' of undefined 可以在这个方法之后发布日志吗:this.apisService.getList() .subscribe((list: any) => console.log(list); , error => console.log ('错误。') ); 是的,如果我这样做,我会打印出 json: "list": [ "Id": 1002469, "Summary": null, "StartDate": "2018-12-11T23:00:00", "EndDate": "2018-12-31T23:00:00", ... 你可以试试console.log(Object.keys(list)) 或console.log(JSON.stringify(list)) 看看输出是什么【参考方案2】:

你应该先为这些类创建一个模型接口,然后

this.apisService.getList()
  .subscribe((list: ListSearch[]) => 
    const value = list;
    console.log(value);
    ,
    (error: any) => console.log('Error.')
  );

【讨论】:

【参考方案3】:

正确的方法:

接口:

export interface IEmployee 
    id: number,
    name: string,
    age: number

服务

getEmployees(): Observable<IEmployee[]>
        return this.http.get<IEmployee[]>(this._url);
    

组件

public employees = [];

ngOnInit() 
    this._employeeService.getEmployees()
    .subcribe(
        data => this.employees = data
    );

【讨论】:

以上是关于如何将 JSON 数据加载到 Angular 中的类或类数组中?的主要内容,如果未能解决你的问题,请参考以下文章

Angular 中的异步数据处理

将大型 JSON 文件数据加载到 Angular cli 表中

如何正确使用 Angular 中的 Observable 将数组数据从父级发送到子级?

如何根据 AWS 中的域名将数据动态加载到 Angular 应用程序?

如何将从服务接收到的 json 数据传递到 Angular 4 的角材料组件中的数组

AngularJS |如何将 Json 的数据发送到 Codeigniter 中的数据库