【问题标题】:How to convert JSON object to an Typescript array in an api如何在 api 中将 JSON 对象转换为 Typescript 数组
【发布时间】:2020-02-28 06:46:06
【问题描述】:

我有一个返回以下内容的 API 请求:

{
    "FarmerDetails": [
   {
    "userId": 1,
    "id": 1,
    "title": "delectus aut autem",
    "completed": false
  },
  {
    "userId": 1,
    "id": 2,
    "title": "quis ut nam facilis et officia qui",
    "completed": false
  }
]
}

我需要在单击按钮时显示标题,并且当按钮单击此“fetchPeople()”函数时会被调用。

fetchPeople() {
    this.peopleService.fetchPeople().subscribe((res:any)=>{
      this.people$ = res;
    });
  }

如何在 typescript 中将我的对象转换为数组并显示特定或所有值。

【问题讨论】:

标签: arrays json angular angular-cli


【解决方案1】:

处理 API 响应对象与处理任何其他 JSON 对象没有什么不同。以同样的方式查询即可。

给出这样的回应:

{
  "FarmerDetails": [
    // array of objects you want to extract from the response
  ]
}

您可以尝试多种方法。

  1. 直接查询JSON对象
fetchPeople() {
  this.peopleService.fetchPeople().subscribe((res:any)=>{
    this.people = res.FarmerDetails;
  });
}
  1. 管道中的地图
fetchPeople() {
  this.peopleService.fetchPeople().pipe(
    .map(res => res.FarmerDetails)
  ).subscribe(people => {
    this.people = people;
  });
}

当人员服务发出类似于上述 JSON 的值时,它会在 map 函数中应用转换,然后将其返回给订阅者。

  1. 拔管
fetchPeople() {
  this.peopleService.fetchPeople().pipe(
    .pluck('FarmerDetails')
  ).subscribe(people => {
    this.people = people;
  });
}

与 map 类似,当人员服务发出类似于上述 JSON 的值时,它会在将其返回给订阅者之前,在 pluck 函数中返回命名属性。

方法 2 和 3 更可取,因为您可以将它们应用到您的服务中。假设这些来自 HTTP 请求,您可以在 get 之后使用管道:

export class PeopleService {
  fetchPeople() {
    return this.http.get(url).pipe(
      pluck('FarmerDetails')
    );
  }
}

此外,变量上的“$”后缀通常用于表示可观察对象。在您的示例中,您只是存储了 observable 发出的值,因此将其命名为 people$ 会令人困惑。为此,我将其命名为people

【讨论】:

  • 感谢您宝贵的时间@Kurt Hamilton,在邮递员中,我正在对 URL“169.38.82.132:94/GetFarmerInfo”使用 POST 请求,并且在我的服务文件中使用代码 headers = new HttpHeaders({ 'Authorization': 'bearer uRf0e8upueR4qTh....', 'InstanceName': 'ORISSA' , 'Content-Type': 'application/json'}); fetchPeople() { return this.http.post('http://169.38.82.132:94/GetFarmerInfo', { headers: this.headers }); };,所以我试图从中提取数据这个 API 和上面的结果,如果我将获取响应的代码更新为“POST 169.38.82.132:94/GetFarmerInfo 401 (Unauthorized)”
  • 您能否将所有相关代码添加到您的问题中。您询问了如何从响应中获取值,但听起来您遇到了完全不同的问题。
  • 我的 stackblitz 代码 url stackblitz.com/edit/angular-pg6wqe,如果我在 people.service.ts 中通过我的 api "169.38.82.132:94/GetFarmerInfo" 而不是 "jsonplaceholder.typicode.com/todos" 它不起作用。在示例 api 中,json 响应是 json 数组,我的响应是带有数组的 json 对象,所以我试图将 json 对象转换为数组以获取响应。希望这清楚...
  • 我已经分叉了您的示例,并且出于演示目的使用 of 而不是 http 请求返回了您的结构中的对象。这里我演示mappluck的使用:stackblitz.com/edit/angular-mkuusq
  • 我已经更新了我的 stackblitz 以发出真正的 http 请求,并按照您的描述获取数据
【解决方案2】:

当您从 api 获得响应时,它将以字符串格式返回。因此,您需要将其转换为 json 格式。解析成json:

this.people=JSON.parse(res);

【讨论】:

  • 你能记录 this.people 吗?你得到回应了吗?
  • 在控制台中我得到“POST 169.38.82.132:94/GetFarmerInfo 401(未授权)。
  • 那么,这与您的问题完全不同。它没有返回响应,你怎么能将 json 对象转换为数组?根据错误,您未经授权。可能是,您需要一些凭据。
猜你喜欢
  • 2021-11-20
  • 2021-06-20
  • 2014-05-17
  • 2022-01-03
  • 1970-01-01
相关资源
最近更新 更多