JSON解析期间Typescript自动类型转换?

时间:2019-02-04 12:58:43

标签: typescript casting type-conversion

我有以下JSON数组,其中id键是一个字符串(呵呵)。

 "locations": [
    {
      "default_currency_id": "17",
      "continent": "1",
      "country_code": "AL",
      "gift_value": "150",
      "alert": "TEST",
      "caption": "Albania",
      "id": "1"
    },

我想使用基于模型中定义的值的自动转换,而不是使用Number函数(请参见附件):请问如何以正确的方式?理想情况下,我想将JSON数组放入类型化模型中而无需手动解析(如您在for循环中所见)

    export class Location {
      default_currency_id: number;
      continent: string;
      country_code: string;
      gift_value: string;
      alert: string;
      caption: string;
      id: number;
    }

parseDataset(data: any) {
    console.log('parseDataset');
    console.log(data);

    if(data.locations_gifts != null) {
      //this.dataSet.locations = data.locations_gifts;
      for(let o of data.locations_gifts){//HOW TO AVOID MANUAL PARSING?
        console.log(o);
        let item: Location = <Location>{
          default_currency_id: Number(o.default_currency_id), //HOW TO AVOID MANUAL CONVERSION?
        };
        this.dataSet.locations.push(item);
      }

    }
    console.log(this.dataSet)
  }

3 个答案:

答案 0 :(得分:0)

您不能那样做。 TypeScript可帮助您在开发中而不是在运行时验证代码。因此,动态响应数据的数据转换不在其范围内(至少到现在为止)

答案 1 :(得分:0)

我认为您可以使用JSON.parse()中的reviver选项 我用它来将JSON日期(字符串)转换为Javascript Date对象 这里的例子: https://mariusschulz.com/blog/deserializing-json-strings-as-javascript-date-objects

答案 2 :(得分:0)

您可以这样在代码中使用签名来做到这一点:

const sign = {
  default_currency_id: "integer",
  continent: "string",
  country_code: "string",
  gift_value: "string",
  alert: "string",
  caption: "string",
  id: "integer"
}

parseDataset(data: any) {
  console.log(data);
  let dataDecoded:any = {};
  Object.keys(this.sign).forEach((key, index) => {

    let value = data[index];

    if (value) {
      switch (this.sign[key]) {
        case 'integer': 
          value = parseInt(value);
          break;

        default: value = value.toString();
      }

      dataDecoded[key] = value;
    }
  });
}