将字符串转换为对象

时间:2017-03-31 16:00:27

标签: javascript rest angular typescript

我正在制作angular2应用程序,现在我正在尝试将字符串解析为对象。基本上发生的事情是我传回一个字符串,我想把它转换成一个名为IDate的唯一对象。 我得到了这种格式的字符串" 2017-02-27T00:00:00",但我希望它为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

1 个答案:

答案 0 :(得分:0)

我假设您从REST API获取JSON字符串。如果这适用于您的情况,您可以使用reviver。以下是使用reviver

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

以下是指向跑步小提琴的链接:https://jsfiddle.net/sayan751/Lzb8u638/

根据OP的comment

进行了更新

将通用对象转换为特定类的实例并不是很直接。请注意,this.mock = response;不会将response转换为Mock类的实例(请参阅新的小提琴链接)。

您可以使用Object.assign,但它可能不适用于类型转换。

另外我认为在您的情况下,JavaScript代码中收到的json对象{Number:number, Time:string}的架构与Mock的架构不匹配:{number:number, time:{value:Date}}

在这种情况下,最好(根据我的意见)为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/

希望这有帮助。