【问题标题】:Deserialize nested Json into class with Typescript使用 Typescript 将嵌套的 Json 反序列化为类
【发布时间】:2021-03-02 14:50:00
【问题描述】:

我有以下 Json:

{
  "Setting": {
    "IsYear": true
  },
  "Durations": [
    {
      "Value": "100000000",
      "Duration": 1
    },
    {
      "Value": "100000001",
      "Duration": 2
    },
    {
      "Value": "100000002",
      "Duration": 3
    },
    {
      "Value": "100000003",
      "Duration": 5
    },
    {
      "Value": "100000004",
      "Duration": 0
    },
    {
      "Value": "100000005",
      "Duration": 8
    },
    {
      "Value": "100000006",
      "Duration": 10
    }
  ]
}

我目前的课程:

class Durations {
    IsYear = false;
    Durations = [];
}

以及反序列化:

let obj: MyObj = JSON.parse(jsonContent);

我实际上正在努力反序列化和访问结果对象中的值。

能否请教我如何使用 TypeScript 将上述 json 正确反序列化为相应的类以及如何访问这些值?

非常感谢任何帮助。

【问题讨论】:

  • 你真的想反序列化为一个吗?为什么不定义一个类型:interface Durations{ IsYear: boolean; Duration: number[]; },然后是const durations: Durations = JSON.parse(...)
  • 没想到这种解决方法,好点。关键是我需要将此对象传递给基于值执行一些计算的方法

标签: javascript json typescript deserialization


【解决方案1】:

一种解决方案是实现序列化和反序列化方法。

我的例子是手动的。

const serializedObj: string = JSON.stringify({
  "Setting": {
    "IsYear": true
  },
  "Durations": [
    {
      "Value": "100000000",
      "Duration": 1
    },
    {
      "Value": "100000001",
      "Duration": 2
    },
    {
      "Value": "100000002",
      "Duration": 3
    },
    {
      "Value": "100000003",
      "Duration": 5
    },
    {
      "Value": "100000004",
      "Duration": 0
    },
    {
      "Value": "100000005",
      "Duration": 8
    },
    {
      "Value": "100000006",
      "Duration": 10
    }
  ]
});

interface MyObjType {
  Setting: {
    IsYear: boolean;
  };

  Durations: {
    Value: string;
    Duration: number;
  }[];
}

class MyObj {
  protected IsYear: MyObjType['Setting']['IsYear'] = false;
  protected Durations: MyObjType['Durations'] = [];

  public serialize(): string {
    return JSON.stringify({
      Setting: {
        IsYear: this.IsYear,
      },

      Durations: this.Durations,
    } as MyObjType);
  }

  public deserialize(serializedObj: string): void {
    const obj: MyObjType = JSON.parse(serializedObj);

    this.IsYear = obj.Setting.IsYear;
    this.Durations = obj.Durations;
  }
}

// --- Test

const obj = new MyObj();

obj.deserialize(serializedObj);

console.log(obj.serialize());

Code snippet

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-08
    • 2023-03-22
    • 1970-01-01
    • 2018-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-17
    相关资源
    最近更新 更多