【问题标题】:Angular7: how to get data from a server in JSON format and put it into an array of ObjectsAngular7:如何以 JSON 格式从服务器获取数据并将其放入对象数组中
【发布时间】:2019-04-03 23:08:34
【问题描述】:

我开始使用 Angular7,并按照教程构建应用程序,从 Web 服务获取输入并将结果放入对象数组中。

只要数据已经以数组的形式出现,它就可以工作。 当数据为 JSON 格式时,它会停止工作。

问题是我在网上论坛上找到的所有答案都包括使用地图功能,当我使用它时,在包含相应的定义文件(来自rxjs/operators)后,我总是得到错误

“groups.map 不是函数”。

另一个问题是我继续为旧版本的 Angular 寻找解决方案,但显然不再适用了。

我正在使用 Angular 7.2.11、typescript 3.2.4、rxjs 6.3.3 和 webpack 4.29.0,而不是之前的众多版本。

我面临的问题应该是一个非常常见的问题:从 REST 服务器以 JSON 格式(嵌套和类型化)获取数据,并将数据放入应用程序所需的数据结构(类)中以执行各种任务.

有人建议放弃 TrueScript 类,直接使用 http.get 调用返回的 JSON 对象。 如果这确实是最佳实践,我想知道如何处理我发布的示例中的 JSON 对象。

我试图完全简化对 http get 的调用:

getGroups(): Observable<Group[]> {

    this.http.get(this.groupsUrl)
      .subscribe(data => {console.log(data);
    });
}

Web 控制台向我显示groups.service.ts 中正确加载的数组“组”。 但是,将数组映射到应用程序对象的下一步不起作用。

这是课程:

export class Group {  
    public dn: string;
    public cn: string[];
    public name: string[];
    public member: string[];

    constructor(args: {
        dn: string,
        cn: string[],
        name: string[],
        member: string[]
    }) {
        this.dn = args.dn
        this.cn = args.cn;
        this.name = args.name;
        this.member = args.member;
    }
}

这是服务:

import { Injectable } from '@angular/core';
import { Observable } from 'rxjs';
import { Group } from './group';
import { MessageService } from './message.service';
import { HttpClient } from '@angular/common/http';
import { map } from 'rxjs/operators';

export class GroupService {

  private groupsUrl = '../assets/groups.json';

  groups: Group[];

  constructor(
    private http: HttpClient,
    private messageService: MessageService) { }

    getGroups(): Observable<Group[]> {

    return this.http.get<Group[]>(this.groupsUrl).pipe(
      map(groups => groups.map(groupJson => new Group(groupJson))));
  }
}

这是组件:

  getGroups(): void {
    this.groupService.getGroups()
      .subscribe(groups => this.groups = groups)
  }

这是json文件:

{
    "groups": [
        {
            "dn": "CN=mycn,OU=Groups,OU=valiant,OU=Organizations,DC=rag,DC=net",
            "cn": [
                "mycn"
            ],
            "name": [
                "mycn"
            ],
            "member": [
                "changz",
                "gorkony",
                "martoks",
                "azetburn"
            ]
        },

...

    ]
}

对于那些有同样问题的人,我在这里发布在用户 Hari Prathap 的帮助下构建的解决方案:

  groups: Group[];

  getConfig() {
    return this.http.get(this.configUrl).pipe(
      map(res => {
        return {
          errMessage: res.errmessage,
          errCode: res.errcode,
          groups: res.data.groups.map(obj => new Group(obj))
        };
      })
    );
  }

  ngOnInit() {
    this.getConfig().subscribe(ret => {
      console.log("errCode", ret.errCode);
      console.log("errMessage", ret.errMessage);
      console.log("groups", ret.groups);

      this.groups = ret.groups;

      console.log("Group 1", this.groups[1]);

    });
  }

解决问题的关键是指出 http.get 函数的返回值代表了来自 REST 服务器的整个响应,而不是我感兴趣的组部分。

可以使用“.”访问组部分。运算符,尽管 IDE 和编译器都不知道在编译时读取的 JSON 的确切结构。

事实上,编译器会发出一个错误,但代码仍然可以工作。 然后可以将通过这种方式从响应中提取的组映射到一个对象数组中,该数组与 JSON 文件中的数组具有相同的结构。

使用这个符号可以避免这个错误:

groups: res["data"].groups.map(obj => new Group(obj))

【问题讨论】:

  • map(groups =&gt; groups.map(groupJson =&gt; new Group(groupJson)))); 中的组是对象还是数组?如果 groups 是一个对象,那么 groups.map 将不起作用。
  • groups 是一个 Group 数组,它是这样定义的:groups: Group[];

标签: arrays json angular7


【解决方案1】:

@Lastshaman67,

问题是管道映射方法获取整个对象,而不仅仅是来自 json 文件的组。我创建了一个代码框供您参考。

https://codesandbox.io/embed/n7xjkrplvl

【讨论】:

  • 在rxjs的map函数中,可以做data.groups。在您的情况下,返回 this.http.get(this.groupsUrl).pipe( map(groups => groups.groups.map(groupJson => new Group(groupJson))));您可以将组重命名为 groupObj 或 data 以提高可读性
  • 我明白了。我分叉了您的代码框,并且成功修改了 getConfig 以返回带有组的对象 []:`getConfig() { return this.http.get(this.configUrl).pipe( map(res => { return res. data.groups.map(obj => obj); }) ); } `
  • 我的 JSON 文件有点复杂,但是:{ "errcode": "0", "errmessage": "OK", "data": { "groups": [ { "name" : "abc", "description": "def", "members": [ "ghi", "jkl", "nop", "qrs" ] }, 是否可以使用 map 将响应数据“转换”成类似于:导出接口 GroupInterface { errcode: string; errmsg:字符串;组:字符串[]; }
  • 您可以根据需要在 rxjs 映射函数中格式化您的响应。请参考codesandbox.io/embed/n7xjkrplvl。我已经更新了我的沙盒
  • 非常感谢。这为我澄清了一切。现在,我修改了您的代码,以便在变量组中返回包含在 JSON 组下的整个数组。如何使用 map 函数将该数组映射到 Group 类的对象数组(即 Group[])?
猜你喜欢
  • 1970-01-01
  • 2012-12-16
  • 2020-02-23
  • 1970-01-01
  • 2012-06-04
  • 2020-10-02
  • 1970-01-01
  • 2013-11-30
  • 2012-10-02
相关资源
最近更新 更多