2017-03-31 5 views
0

저는 angular2 응용 프로그램을 만들고 있습니다. 그리고 지금은 문자열을 객체로 파싱하려고합니다. 기본적으로 무슨 일이 일어나고 있는지 문자열을 다시 전달하고, 나는 IDate라는 고유 한 객체로 변환하고 싶습니다. "2017-02-27T00 : 00 : 00"형식의 문자열이 있지만 IDate()로 사용하고 싶습니다. 그래서 지금까지 한 것은 IDate 클래스를 만든 것입니다. IDate 클래스는 문자열을 받아 날짜로 변환합니다. 나는 응답을 객체에 매핑하기 위해 Mock 클래스를 만들었다. 그러나, 내가 개체를 인쇄 할 때, 나는 값이 문자열을 유지 참조하십시오. 누구가 내가 말하는 것을 성취하는 방법을 아는가? 컨트롤러에서 응답을 매핑 할 때 기본적으로 문자열을 개체에 매핑하려고합니다. 나는 같은 작업에서 이것을 할 수 있습니다. resposne.map(r.time => new Date(r.time));하지만 다른 장소에서이 컨트롤러를 호출하고 별도의 페이지에서 프로세스를 반복하고 싶지 않기 때문에 오히려 응답에 매핑해야합니다. 이 작업을 수행 할 수 있습니까?문자열을 객체로 변환

컨트롤러

 return Json(new { Number = 1, Time= "2017-02-27T00:00:00" }); 

클라이언트

class IDate { 
    value: Date; 
    contructor(value) { 
     this.value = new Date(value); 
    } 
} 
class Mock { 
    number: number; 
    time: IDate; 
} 
mock: Mock = null; 

this.service.get() 
      .subscribe(
      response => { 
       console.log("Test response"); 
       this.mock = response; 
       console.log(this.mock); 
      }, 

콘솔

Object 
    number:1 
    time:"2017-02-27T00:00:00" 
    __proto__:Object 
+0

문자열 형식의 개체를 전달하면 문자열이 전달되어 개체로 변환됩니다. – John

+0

[Date (dateString)과 new Date (dateString) 간의 차이점] 가능한 복제본 (http : // stackoverflow .com/questions/3505693/차이점 - datedatestring-and-new-datedatestring) –

+0

@ScottMarcus 무엇을 하려는지가 아니라 질문을 다시 읽고 명확하지 않은지 알려주십시오. – John

답변

0

나는 당신이 당신의 REST API에서 JSON 문자열을 받고 있다고 가정하고있다. 귀하의 사례에 해당되는 경우 reviver을 사용할 수 있습니다. 여기

JSON.parse(jsonString, function (key, value) { 
    if (key === "time") 
     return new Date(value); 
    return value; 
}) 

실행중인 바이올린에 대한 링크입니다 : 여기에 reviver를 사용하는 간단한 방법입니다 https://jsfiddle.net/sayan751/Lzb8u638/.


은 영업 이익의 comment

가 특정 클래스의 인스턴스에 일반 객체를 변환을 기반으로 업데이트하는 것은 매우 정직하지 않다. this.mock = response;responseMock 클래스의 인스턴스로 변환하지 않습니다 (새로운 바이올린 링크 참조).

Object.assign을 사용할 수는 있지만 형식 변환에서는 작동하지 않을 수 있습니다. {number:number, time:{value:Date}} :

또한 나는 귀하의 경우, 자바 스크립트 코드에서받은 JSON 객체 {Number:number, Time:string}의 스키마가 Mock의 스키마와 일치하지 않을 생각합니다.

이 경우에는 Mock에 대한 사용자 지정 변환기를 작성하는 것이 가장 좋습니다 (제 의견에 따르면). 하나의 단순한 접근 방식은 다음과 같습니다. 자세한 코드는 새로운 바이올린 링크를 참조하십시오.

class Mock { 
    number: number; 
    time: IDate; 

    public static create(obj):Mock{ 
     let retVal = new Mock(); 
     retVal.number=obj.number; 

     if(typeof obj.time === "string") 
     retVal.time = new Date(obj.time); //better to use moment in this case, if possible 
     else if(obj.time instanceof Date) 
     retVal.time = obj.time; 

     return retVal; 
    } 
} 

var jsonObj = { number: 1, time: "2017-02-27T00:00:00" }; 

var obj = Mock.create(jsonObj); 

링크 바이올린 :이 도움이 https://jsfiddle.net/sayan751/mxoqqc5a/

희망을.

+0

JSON 개체가 생기고 Mock 클래스에 매핑됩니다. , 나는 문자열 데이터를 날짜로하고 싶습니다. 그러나 어떤 이유로 그것은 하나에 매핑되지 않습니다. – John

+0

@ 존 답변을 업데이트했습니다. 희망이 도움이됩니다. –

+0

개체를 인스턴스화하지 않고 맵핑 될 때 값을 변경하려고 시도하지만 불가능하다는 것을 알 수 있습니다. – John

관련 문제