首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何遍历HttpClient返回的JSON

如何遍历HttpClient返回的JSON
EN

Stack Overflow用户
提问于 2020-10-28 13:42:47
回答 2查看 167关注 0票数 0

我有一个简单的Angular HttpClient,它正确地返回了JSON。我试图强制转换结果以加强类型安全(不确定这是否正确)。

但是,我如何实际访问返回的JSON以将其复制到数组中呢?

httpClient get()请求是(而且看起来运行得很好):

代码语言:javascript
运行
复制
public sendGetRequest(): Observable<Symbols[]> {
    return this.httpClient.get<Symbols[]>(this.REST_API_SERVER);
  }

Symbols接口是

代码语言:javascript
运行
复制
export interface Symbols {
  code: string
  desc: string
}

我有一个调用数据服务并得到响应的组件。但是,以下代码在尝试将JSON映射到字符串数组时返回错误

代码语言:javascript
运行
复制
ERROR TypeError: syms.map is not a function
代码语言:javascript
运行
复制
listOfOption: Array<{ value: string; label: string }> = []

this.dataService.sendGetRequest().subscribe((syms: Symbols[]) => {
  console.log('return value ' + JSON.stringify(syms))
  // console output shows the returned JSON and it looks correct

  //this does not work, how do I copy the results to a string array??
  this.listOfOption = syms.map(results => {
     return {
        value: results.code,
        label: results.code,
     }
  })
})

JSON数据结构是:

代码语言:javascript
运行
复制
{
  "results": [
    {
      "code": "code1",
      "desc": "Long description of code 1"
    },
    {
      "code": "code2",
      "desc": "Long description of code 2"
    },
    {
      "code": "code3",
      "desc": "Long description of code 3"
    },
    {
      "code": "code4",
      "desc": "Long description of code 4"
    }
  ]
}

这快把我逼疯了

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-10-28 14:39:19

对一个名为responseData的新接口建模,以支持响应类型。

代码语言:javascript
运行
复制
export interface responseData{
  results: Symbols[]
}


export interface Symbols {
   code: string
   desc: string
}

在服务中更新相同内容

代码语言:javascript
运行
复制
public sendGetRequest(): Observable<responseData> {
  return this.httpClient.get<responseData>(this.REST_API_SERVER);
}

现在可以使用array.map()检索结果。

代码语言:javascript
运行
复制
listOfOption: Array<{ value: string; label: string }> = []

this.dataService.sendGetRequest().subscribe((syms: responseData) => {
  console.log('return value ' + syms)

  
  this.listOfOption = syms.results.map(result => {
     return {
        value: result.code,
        label: result.code,
     }
  })
})
票数 1
EN

Stack Overflow用户

发布于 2020-10-28 13:49:20

响应数据有一个object根,但您试图将其解析为array根。我认为最简单的解决方案是这样的:

代码语言:javascript
运行
复制
public sendGetRequest(): Observable<Symbols[]> {
  return this.httpClient.get<{results: Symbols[]}>(this.REST_API_SERVER)
    .pipe(pluck('results'));
}

它指定响应数据是一个对象,其中包含一个名为results的字段,该字段包含一个Symbols数组。

或者,您也可以将响应类型提取到单独的定义中:

代码语言:javascript
运行
复制
interface ApiResponse {
  results: Symbols[]
}

public sendGetRequest(): Observable<Symbols[]> {
  return this.httpClient.get<ApiResponse>(this.REST_API_SERVER)
    .pipe(pluck('results'));
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64567044

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档