如何从 Angular2 应用程序获取 json 值

How to get json value from Angular2 app

我需要从 JSON 文件中获取值,该文件由 fake-json-server 提供。 准确地说,我需要一个确切的值,例如我需要得到所有 "type": "values" 组是 Air.

我将 Angular2 与 TypeScript 一起使用,这是我在 TransformerService 文件中执行获取请求的代码的一部分:

getVehicleGroups(groupName: string) {
    return this.http.get(`${this.apiUrl}/vehicleTypes?group=${groupName}`)
    .map((res: Response) => res.json() as VehicleTypes[]).catch(this.handleError);
}

已导出 class:

export class VehicleTypes {
     // vehicleGroup: string;
     vehicleType: string;
     vehicleModel: string;
}

我在单独的文件中调用该方法:

getVehicleGroups() {
    return this.transformersService.getVehicleGroups(this.vehicleGroup)
    .subscribe((vehicleTypes => this.vehicleTypes = vehicleTypes));
}

假服务器“http://localhost:3000/vehicleTypes”的url,这是来自该服务器(url)上db.json的代码:

    [
      {
        "group": "Air",
        "type": "Plane",
        "model": "F-22"
      },
      {
        "group": "Air",
        "type": "Plane",
        "model": "Sukhoi"
      },
      {
        "group": "Air",
        "type": "Plane",
        "model": "MiG"
      },
      {
        "group": "Air",
        "type": "Helicopter",
        "model": "Apache"
      },
      {
        "group": "Air",
        "type": "Helicopter",
        "model": "Kamov"
      }
      {
        "group": "Sea",
        "type": "Boat",
        "model": "Sailboat"
      },
      {
        "group": "Sea",
        "type": "Boat",
        "model": "Jetboat"
      },
      {
        "group": "Sea",
        "type": "Submarine",
        "model": "Standard"
      },
      {
        "group": "Land",
        "type": "Car",
        "model": "Camaro"
      },
      {
        "group": "Land",
        "type": "Car",
        "model": "AMG GT R"
      },
      {
        "group": "Land",
        "type": "Car",
        "model": "Lamborghini"
      },
      {
        "group": "Land",
        "type": "Truck",
        "model": "Unimog"
      },
      {
        "group": "Land",
        "type": "Truck",
        "model": "Western Star 5700"
      }
    ]

我需要说明一下,我所有的文件都设置好了。我没有收到任何错误,我只是没有得到正确的值..

  1. 调整方法的括号。

发件人:

getVehicleGroups() {
    return this.transformersService.getVehicleGroups(this.vehicleGroup)
    .subscribe((vehicleTypes => this.vehicleTypes = vehicleTypes));
}

收件人:

getVehicleGroups() {
    return this.transformersService.getVehicleGroups(this.vehicleGroup)
    .subscribe((vehicleTypes) => this.vehicleTypes = vehicleTypes);
}
  1. 将数据映射到您的模型:

选项 1:更改模型以匹配 json 数据。

export class VehicleTypes {
     type: string;
     model: string;
}

选项 2:在转换为 json 后立即更改服务级别的 json 属性。

getVehicleGroups(groupName: string) {
    return this.http.get(`${this.apiUrl}/vehicleTypes?group=${groupName}`)
    .map((res: Response) => res.json().map(res => new VehicleTypes(res.type, res.model)).catch(this.handleError);
}

并且您需要为 VehicleType 创建一个构造函数。

在这种情况下,您不需要 classtype interface 就足够了,因为您的车辆中没有(或似乎不需要)任何方法,您只是在使用它用于类型断言。

A class 存在于发出的 JavaScript 中,会产生不必要的开销,而接口提供类型安全性而不向 JavaScript 发出 classes:它仅由tsc 中的类型检查器,然后被丢弃。

export interface VehicleTypes {
     // vehicleGroup: string;
     vehicleType: string;
     vehicleModel: string;
}

声明您的服务类型 returns:

getVehicleGroups(groupName: string): Observable<VehicleTypes[]> {
    return this.http.get(`${this.apiUrl}/vehicleTypes?group=${groupName}`)
      .map(res.json)
      .catch(this.handleError);
}

并在您的组件中使用它作为:

// Assert the type vehicleTypes expects
vehicleTypes: <VehicleTypes>[];

getVehicleGroups() {
    return this.transformersService.getVehicleGroups(this.vehicleGroup)
    .subscribe(vehicleTypes => this.vehicleTypes = vehicleTypes);
}

请注意,您不需要来自 http.get 的链中的 (res: Response) 断言:无论如何,这就是 get 被输入到 return 的内容,因此类型检查器已经知道要输入什么预计。由于您可以删除参数,因此可以使链更短,就像您对 .catch.

所做的那样

I need to get all "type": "values" where group is Air

首先,您需要过滤 json 结果以仅获得 Air 组。

您可以应用 observable filter

getVehicleGroups(groupName: string) {
    return this.http.get(`${this.apiUrl}/vehicleTypes?group=${groupName}`)
    .filter(data => data.group === "Air")
    .map((res: Response) => res.json() as VehicleTypes[]).catch(this.handleError);
}

其次,您的 VehicleTypes 模型变量名称与 json 响应不同,因此 angular 如何将您的 json 数组转换为 VehicleTypes 数组。您需要更改 VehicleTypes class 或您的后端代码发送匹配变量名称。

export interface VehicleTypes {
        type: string;
     model: string;
}