Angular 将 json 字符串日期响应转换为 JS 日期的 8 种方法?
Angular 8 way to convert json response with string dates to JS date?
我知道 json 不会以特殊方式处理日期,而是将它们作为来自服务器的字符串提供。有没有办法提供具有 ISO 日期 属性 的 json 对象响应并将其映射到已经将日期 属性 映射为 JS 日期的 class?
示例:
Json 响应:
{
"data": {
"id": 1,
"name": "John",
"surname": "Smith",
"birthDate": "1986-05-04T22:59:59.000Z"
"subscriptionDate": "2020-06-28T14:36:43.498Z"
}
}
我有这个 class:
export class User {
id: string;
name: string;
surname: string;
birthDate: Date;
subscriptionDate: Date;
}
我的服务方式:
getUser(id: string): Observable<User> {
return this.http.get<User>(`${this.UrlService}estabelecimentos/${id}`, { headers: this.authenticationService.jwt() }).catch(super.serviceError);
}
但是当我在我的组件中使用它时 birthDate 和 subscriptionDate 总是被视为字符串。是否可以通过迭代 json 响应和修改对象将其转换为 JS 日期,而不必在每个请求中格式化日期?
简短的回答是否定的,因为 JSON 格式不允许日期类型。看到这个:https://www.w3schools.com/JS/js_json_datatypes.asp
除了将它们转换为 Date 对象之外,我认为您别无选择,此外,鉴于您的字符串日期格式,它相对微不足道:
ndate = new Date("1986-05-04T22:59:59.000Z")
JSON 不对日期提供任何特殊支持。您需要手动转换它。如下:
new Date("1986-05-04T22:59:59.000Z");
将 JSON 对象转换为 Javascript 对象可以帮助您实现所需的目标。
检查这个函数:
function convertJsonIntoJavaScript(data){
let newObj = new Object();
Object.keys(data).forEach(x=> {
let d = new Date(data[x]);
newObj[x]= (d instanceof Date && !isNaN(d))? d: data[x];
});
return newObj;
}
注意:我还没有测试过这个功能,如果它有效,请在下面的评论中写下你的反馈。
由于 GET 将要 return 一个可观察对象,您应该可以这样做:
getUser(id: string): Observable<User> {
return this.http.get<User>(`${this.UrlService}estabelecimentos/${id}`, { headers: this.authenticationService.jwt() })pipe(
map(response => {
return {
"data": {
"id": response.id,
"name": response.name,
"surname": response.surname,
"birthDate": new Date(response.birthDate)
"subscriptionDate": new Date(response.subscriptionDate)
}
}),
catchError(()=> super.serviceError)
)
}
我建议在返回之前转换 json 响应,如下所示:
getAll(): Observable<Session[]> {
return this.apiService.get(`/sessions`).pipe(
map((data)=>{
return data.map((session) => {
session.startDate = new Date(session.startDate);
session.endDate = new Date(session.endDate);
return session;
}
)})
);
}
我知道 json 不会以特殊方式处理日期,而是将它们作为来自服务器的字符串提供。有没有办法提供具有 ISO 日期 属性 的 json 对象响应并将其映射到已经将日期 属性 映射为 JS 日期的 class?
示例:
Json 响应:
{
"data": {
"id": 1,
"name": "John",
"surname": "Smith",
"birthDate": "1986-05-04T22:59:59.000Z"
"subscriptionDate": "2020-06-28T14:36:43.498Z"
}
}
我有这个 class:
export class User {
id: string;
name: string;
surname: string;
birthDate: Date;
subscriptionDate: Date;
}
我的服务方式:
getUser(id: string): Observable<User> {
return this.http.get<User>(`${this.UrlService}estabelecimentos/${id}`, { headers: this.authenticationService.jwt() }).catch(super.serviceError);
}
但是当我在我的组件中使用它时 birthDate 和 subscriptionDate 总是被视为字符串。是否可以通过迭代 json 响应和修改对象将其转换为 JS 日期,而不必在每个请求中格式化日期?
简短的回答是否定的,因为 JSON 格式不允许日期类型。看到这个:https://www.w3schools.com/JS/js_json_datatypes.asp
除了将它们转换为 Date 对象之外,我认为您别无选择,此外,鉴于您的字符串日期格式,它相对微不足道:
ndate = new Date("1986-05-04T22:59:59.000Z")
JSON 不对日期提供任何特殊支持。您需要手动转换它。如下:
new Date("1986-05-04T22:59:59.000Z");
将 JSON 对象转换为 Javascript 对象可以帮助您实现所需的目标。
检查这个函数:
function convertJsonIntoJavaScript(data){
let newObj = new Object();
Object.keys(data).forEach(x=> {
let d = new Date(data[x]);
newObj[x]= (d instanceof Date && !isNaN(d))? d: data[x];
});
return newObj;
}
注意:我还没有测试过这个功能,如果它有效,请在下面的评论中写下你的反馈。
由于 GET 将要 return 一个可观察对象,您应该可以这样做:
getUser(id: string): Observable<User> {
return this.http.get<User>(`${this.UrlService}estabelecimentos/${id}`, { headers: this.authenticationService.jwt() })pipe(
map(response => {
return {
"data": {
"id": response.id,
"name": response.name,
"surname": response.surname,
"birthDate": new Date(response.birthDate)
"subscriptionDate": new Date(response.subscriptionDate)
}
}),
catchError(()=> super.serviceError)
)
}
我建议在返回之前转换 json 响应,如下所示:
getAll(): Observable<Session[]> {
return this.apiService.get(`/sessions`).pipe(
map((data)=>{
return data.map((session) => {
session.startDate = new Date(session.startDate);
session.endDate = new Date(session.endDate);
return session;
}
)})
);
}