【问题标题】:Angular display single http responseAngular 显示单个 http 响应
【发布时间】:2019-08-19 00:24:25
【问题描述】:

我正在努力通过角度显示来自单个 JSON 响应的数据。 我为数据 interndata.model.ts 创建了一个类

export class Interndata {
humidity: number;
temperature: number;

constructor(humidity:number, temperature:number) {
    this.humidity = humidity;
    this.temperature = temperature;
  }

}

为此,我创建了一个服务 interndata.service.ts

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Interndata } from './interndata.model';
import { Observable } from 'rxjs';

@Injectable({
   providedIn: 'root'
})
export class InterndataService {

 constructor(private http: HttpClient){}

 public getDisplayData(): Observable<Interndata[]>{
       return this.http.get<Interndata[]>('http://192.168.0.110:8080/process');
      }
 }

来自网络服务的我的 JSON 响应是这样的:

{“湿度”:49.099998474121094,“温度”:24.899999618530273}

AppComponent 类会定期获取数据并更新 ngx-gauge 以显示数据。

import { Component, OnInit } from '@angular/core';
import { NgxGaugeModule } from 'ngx-gauge';
import { HttpClient } from '@angular/common/http';
import { concatMap, map, merge, switchMap, tap, delay, skip } from 'rxjs/operators';
import { concat, of, Observable, BehaviorSubject, timer } from 'rxjs';
import { Interndata } from './interndata.model';
import { InterndataService } from './interndata.service';

@Component({
    selector: 'app-root',
    templateUrl: './app.component.html',
    styleUrls: ['./app.component.css']
})



export class AppComponent implements OnInit {

interndata = new Array<Interndata>();
title = 'Home Automation Monitor Service';
tempValue = 0;
humValue = 0;
gaugeType = "semi";
tempLabel = "Temperatur";
tempAppendText = "°C";
gaugeThick = 25;
gaugeForegroundColor = "#000000";
gaugeBackgroundColor = "#FFFFFF";
tempMin = 0;
tempMax = 30;
humLabel = "Luftfeuchtigkeit";
humAppendText = "%";
humMin = 0;
humMax = 100;
constructor(private servinterdata : InterndataService){
    servinterdata.getDisplayData().subscribe((res) => {
        this.interndata = res;
        console.log(this.interndata);
    });
}

ngOnInit () {

}

}

我不知道如何使用来自 JSON 响应的数据。 Console.log 将 JSON 作为字符串返回。

this.interndata.humidity 

返回未定义。如何访问我从 JSON 响应中获取的数据?

【问题讨论】:

  • 你检查了开发者工具,看看你得到了什么样的回应?
  • console.log(res); 打印什么
  • 您已将响应键入为数组Interndata[],也许这就是您想要的,但在这种情况下,json 必须是这样的数组。 [{"humidity": 49.099998474121094, "temperature": 24.899999618530273}]
  • 如果 Angular 正确解析单个对象(没有理由应该但你永远不知道 :) 像这样访问数据this.interndata[0].humidity
  • @NathanielJohnson 方法标记,因为它会返回一个数组而不是单个对象,结果可能是 [{}]

标签: json angular web-services


【解决方案1】:

如果它返回一个字符串,this.interndata = JSON.parse(res) 应该会为您提供一个不错的 javascript 对象。如果这不起作用,请告诉我,我们可以尝试其他方法。

【讨论】:

  • HttpClient 类默认会解析响应??
  • 是的,这就是我的想法,但在问题中他们说“Console.log 将 JSON 作为字符串返回”。这看起来很奇怪,但如果是这样的话,很容易解决。我想知道它们是否意味着键是字符串,如果是这样,它应该都可以通过 res["humidity"] 或他们需要的任何键访问。
  • 很难知道这里的问题,但问题仍然有些模糊,似乎一切正常,但我们在这里只是猜测?,如果用户显示我的结果,也许我们可以解决它? ?
  • 你是对的,但是?我还是不知道这是怎么回事??
【解决方案2】:
public getDisplayData(): Observable<Interndata[]> 

表示返回一个 Interndata 数组的 Observable。这意味着您已将响应键入为数组 Interndata[] 也许这就是您想要的,但在这种情况下,json 必须是这样的数组。

[{"humidity": 49.099998474121094, "temperature": 24.899999618530273}] 

并且会像这样被访问:

this.interndata[0].humidity

为了帮助调试,您可以添加这样的错误处理程序

public getDisplayData(): Observable<Interndata[]> {
       return this.http.get<Interndata[]>('http://192.168.0.110:8080/process')
        .pipe<Interndata[]>(
          catchError(err=>console.log('Err: '+err))
        );
}

这是一个很好的 RxJx 错误处理教程:https://blog.angular-university.io/rxjs-error-handling/

【讨论】:

  • 不幸的是,这也不起作用。我还尝试删除类和方法中的数组。 constructor(private servinterdata : InterndataService){ servinterdata.getDisplayData().subscribe(res =&gt; console.log("Result" + res.humidity), err =&gt; console.log('HTTP error',err) ); } 响应则为 Resultundefined
  • 我的怀疑是您的服务将响应类型错误地标记为文本。您可以通过在浏览器中打开调试窗口 Ctrl+Shift+I(通常在 FF 和 Chrome 中)并仔细阅读网络选项卡来检查这一点。刷新将是必要的。另外,我对答案进行了更改(也需要输入管道)
猜你喜欢
  • 2019-01-01
  • 2021-07-08
  • 2017-03-05
  • 2018-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-25
  • 1970-01-01
相关资源
最近更新 更多