从 Component 中的 Service 解析 JSON 数组对象

Posted

技术标签:

【中文标题】从 Component 中的 Service 解析 JSON 数组对象【英文标题】:Parse the JSON array object from the Service in the Component 【发布时间】:2017-11-25 00:18:02 【问题描述】:

这是我从服务传递到组件的响应,我应该在其中向 UI 显示每个值。我需要解析每个值并存储到一个变量中。

["profileId":"000234","profileName":"kofi prfl","regionName":"NA  ","fileType":"GRRCN","fileVersion":"1.01","fileFreq":"D01","fileFormat":"FIX","emptyFile":"N","cardMask":"Y","uprInd":"N","dataLevel":"01"]

this.profileDetailsService.getProfileDetails(this.idDisplay)
      .subscribe(profileResponse => 
          // Should parse the profileResponse here....
          this.searchResult = profileResponse;
          this.spinnerService.hide();
        ,
      error => 
          this.spinnerService.hide();
          this.showError();
        
      );

profileId、profileName、regionName等值如何分隔?

【问题讨论】:

您可以发布更多代码吗?我可以看看你们的服务、模板和组件吗? 【参考方案1】:

根据评论代码更新:

您无法访问searchResult 的属性的原因是服务返回的是响应而不是带有属性的javascript 对象。

来自 HTTP Angular 文档here:

响应数据为 JSON 字符串形式。该应用程序必须解析 通过调用 response.json() 将字符串转换为 JavaScript 对象。

我建议在服务中解析响应以保留与 http 请求相关的内容并防止代码重复。

变化:

return this.http.post(this._url, body, options).map((response: Response) => 
    return response;
).catch((error) => 
    return Observable.throw(error);
);

对此(如果您确实只想要数组中的第一个配置文件):

 return this.http.post(this._url, body, options).map((response: Response) => 
        return response.json()[0];
    ).catch((error) => 
        return Observable.throw(error);
    );

新代码解析 JSON 对象并从数组中提取第一个对象.json()[0]。然后将profileResponse 重命名为profileDetails 并使用点符号访问this.searchResult 的属性:

例如从组件中的另一个函数: console.log(this.searchResult.profileName)

例如从您的模板: searchResult.profileName

【讨论】:

profileResponse.profileId 不显示字段中的值。它只是在控制台中显示未定义。 您确定返回的是实际对象而不是服务中的 json 字符串吗?您的服务是否调用 response.json()? return this.http.post(this._url, body, options) .map((response:Response) => return response; ) .catch((error) => return Observable .throw(错误); ); this.profileDetailsS​​ervice.getProfileDetails(this.idDisplay) .subscribe(profileResponse => this.value1 = profileResponse.profileId; this.value2 = profileResponse.profileName; this.searchResult = profileResponse; console.log("stringify values is "+ JSON .stringify(this.searchResult)); this.spinnerService.hide(); ); 这就是我将响应从服务传递到组件的方式。【参考方案2】:

而不是在您的代码中:

...
this.searchResult = profileResponse;
...

你可以使用:

searchResult: any[];

...
this.searchResult = profileResponse.json() || 
...

然后您可以通过 searchResult 项访问每个​​属性:

this.searchResult[0].profileId, etc

【讨论】:

这就像一个魅力!为此挣扎了将近8个小时。谢谢!

以上是关于从 Component 中的 Service 解析 JSON 数组对象的主要内容,如果未能解决你的问题,请参考以下文章

Spring注解 @Component@Repository@Service@Controller @Resource@Autowired@Qualifier 解析

Spring中的@Service与@Component [重复]

Spring中的@Component、@Repository和@Service注解有啥区别?

Spring注解Component原理源码解析

通过 org.osgi.service.component 注解抽象组件

注解service和component的区别