2017-09-03 1 views
0

json 응답을 개체에 전송하려고 할 때 문제가 있습니다. 개체의 모든 속성이 정상입니까? 여기 각도 : 개체 모델로 JSON 응답이 작동하지 않습니다.

public getSingle = (keys: any[]): Observable<Badge> => { 
     return this._http.get(this.actionUrl + this.getKeysUrl(keys)) 
      .map((response: Response) => response.json() as Badge) 
      .catch(this.handleError); 
} 

내 배지 모델 : 여기

내 아약스 요청 여기

export interface Badge { 
     badgeNumber: number; 
     authorizationLevel: number; 
     endOfValidity: Date; 
    } 

하고 나는 서비스 함수를 호출하고 난 문제에 직면하고있어 여기서

this._badgeService.getSingle(this.ids).subscribe(
     (badge: Badge) => { 
     console.log(typeof(badge.endOfValidity)); // <-- returning string and not Date 
     }, 
     error => console.log(error); 
     }); 
+0

'Badge'는 * 어설 션 *이므로 실제로 아무 것도 던지지 않습니다. JSON 데이터에서 직접 새 배지 객체를 만들어야합니다. – jonrsharpe

+0

내 생각에 그걸하는 가장 좋은 방법 위에 내게 말해 주겠니? –

답변

2

설명이 다소 까다 롭습니다.

Date클래스이면 이것은 생성자 호출을 통해 Date 유형의 값을 만들어야 함을 의미합니다. 즉, new Date(...)으로 클래스 인스턴스를 만듭니다.

Response.json 메서드는 JSON 형식의 개체 만 반환하며 모든 클래스의 인스턴스를 포함하지 않으며 key : 속성의지도 만 포함합니다.

그래서해야 할 일은 .json()에서 반환 된 값을 Base 개체로 수동으로 변환하는 것입니다. 다음과 같이 수행 할 수 있습니다 :

public getSingle = (keys: any[]): Observable<Badge> => { 
     return this._http.get(this.actionUrl + this.getKeysUrl(keys)) 
      .map(r => r.json()) 
      .map(v => <Badge>{ 
       badgeNumber: v.badgeNumber, 
       authorizationLevel: v.authorizationLevel, 
       endOfValidity: new Date(v.endOfValidity) 
       // preferably this string should be in ISO-8601 format 
      }) 
      //the mapping step can be done in other ways most likely 
      .catch(this.handleError); 
} 
+0

사실 더 명확한 문제가 있습니다. 난 당신의 솔루션을 시도하고 매력처럼 일했는데 그 방법을 호출하면 내 구성 요소에서 그것을 할 수있는 어떤 방법입니까? 내 서비스 클래스는 일반적이므로 객체는 기본적으로 아무 것도 될 수 있으므로 –

+0

Observable 서비스에서 수동 매핑을 사용하면 endOfValidity 유형을 문자열로 변경하고 객체를 조작해야합니다. 구성 요소. –

+0

안녕하세요. @ Jota.Toledo이게 무슨 getKeysUrl입니까? 왜 2 URL? 한 URL에서 JSON 개체의 목록을 검색하는 Im, 다른 하나는 무엇입니까? –

관련 문제