gpt4 book ai didi

json - 使用 Angular 4.3 HttpClient 解析日期

转载 作者:太空狗 更新时间:2023-10-29 16:53:31 24 4
gpt4 key购买 nike

我目前正在切换到 Angular 4.3 的新 HttpClient。一个优点是我可以在 GET 方法上指定类型信息,并将返回的 JSON 解析为给定类型,例如

this.http.get<Person> (url).subscribe(...)

但不幸的是,JSON 中的所有日期在结果对象中都被解析为数字(可能是因为 Java Date 对象在后端被序列化为数字)。

对于旧的 Http,我在调用 JSON.parse() 时使用了一个 reviver 函数,如下所示:

this.http.get(url)
.map(response => JSON.parse(response.text(), this.reviver))

在 reviver 函数中,我根据数字创建了日期对象:

reviver (key, value): any {
if (value !== null && (key === 'created' || key === 'modified'))
return new Date(value);

return value;
}

新的HttpClient是否有类似的机制?或者在解析 JSON 时进行转换的最佳做法是什么?

最佳答案

这对我有用:

import { Injectable } from '@angular/core';
import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent, HttpErrorResponse, HttpResponse } from '@angular/common/http';
import { Observable } from 'rxjs/Observable';

@Injectable()
export class ApiInterceptor implements HttpInterceptor {
private dateRegex = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)$/;

private utcDateRegex = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/;

constructor() { }

intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
return next.handle(request)
.do((event: HttpEvent<any>) => {
if (event instanceof HttpResponse) {
this.convertDates(event.body);
}
});
}

private convertDates(object: Object) {
if (!object || !(object instanceof Object)) {
return;
}

if (object instanceof Array) {
for (const item of object) {
this.convertDates(item);
}
}

for (const key of Object.keys(object)) {
const value = object[key];

if (value instanceof Array) {
for (const item of value) {
this.convertDates(item);
}
}

if (value instanceof Object) {
this.convertDates(value);
}

if (typeof value === 'string' && this.dateRegex.test(value)) {
object[key] = new Date(value);
}
}
}
}

bygrace 的答案相比的优势是你不需要自己解析为json,你只需在angular完成解析后转换日期。

这也适用于数组和嵌套对象。我修改了this它应该支持数组。

关于json - 使用 Angular 4.3 HttpClient 解析日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46559268/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com