在Angular/TypeScript中调用JSON接口仅需2字段是否需创建所有实体类?
不需要创建所有关联实体类!
嗨,Diego!好问题——你完全不用为了获取lat和lng这两个字段,就创建那11个完整的关联实体类。下面给你两种简单的实现方式:
方法1:直接提取所需字段(快速简洁)
你可以在map操作里直接从返回的JSON数据中嵌套提取location里的经纬度,不需要定义任何额外的类/接口:
getCoord(city: string): Observable<{ lat: number; lng: number }> { return this._http.get(`${this.urlBase}${city}${this.key}`) .pipe( map((response: any) => { // 从响应中提取第一个结果的经纬度 const location = response.results[0].geometry.location; return { lat: location.lat, lng: location.lng }; }), tap(data => console.log('提取的经纬度: ' + JSON.stringify(data))) ); }
注意:这里用了RxJS的
pipe和tap(RxJS 6+推荐用tap替代旧版的do),如果你还在用RxJS旧版本,可以换回do。
方法2:定义最小化接口(兼顾类型安全)
如果你想要一点类型保障,但又不想写全11个实体类,可以只定义你需要的最小化接口:
// 只定义你需要的结构 interface Coordinate { lat: number; lng: number; } getCoord(city: string): Observable<Coordinate> { return this._http.get(`${this.urlBase}${city}${this.key}`) .pipe( map((response: any) => { const location = response.results[0].geometry.location; return { lat: location.lat, lng: location.lng } as Coordinate; }), tap(data => console.log('提取的经纬度: ' + JSON.stringify(data))) ); }
为什么不需要全量实体类?
因为HTTP响应解析后是普通的JavaScript对象,你可以直接通过属性链(比如results[0].geometry.location)访问嵌套的字段,不需要把整个响应结构都映射到TypeScript类/接口里。只有当你需要操作响应里的大量其他字段,或者需要严格的类型校验时,才需要考虑定义完整的实体类。
内容的提问来源于stack exchange,提问作者Diego Venâncio
相关产品推荐
相关产品推荐

