当前位置: 首页 > 知识库问答 >
问题:

JSON 到 TypeScript 类实例?[重复]

井轶
2023-03-14

我做了相当多的研究,但我对我的发现并不完全满意。只是为了确定这是我的问题:实际上,将JSON反序列化为TypeScript运行时类实例的最强大,最优雅的自动化解决方案是什么?

假设我得到了这个类:

class Foo {
  name: string;
  GetName(): string { return this.name };
}

假设我得到了这个JSON字符串用于反序列化:

{"name": "John Doe"}

对于获取名称设置为“John Doe”的 Foo 类实例和 GetName() 方法的工作,最佳且最可维护的解决方案是什么?我问得很具体,因为我知道很容易反序列化为纯数据对象。我想知道是否有可能获得具有工作方法的类实例,而无需进行任何手动解析或任何手动数据复制。如果无法实现完全自动化的解决方案,那么下一个最佳解决方案是什么?

共有3个答案

杜轩昂
2023-03-14

将JSON反序列化为TypeScript运行时类实例的最健壮、最优雅的自动化解决方案是什么?

将属性修饰器与 ReflectDecorator 结合使用来记录可在反序列化过程中使用的运行时可访问的类型信息,这提供了一种令人惊讶的干净且适应性广泛的方法,该方法也可以很好地适应现有代码。它也是完全自动化的,也适用于嵌套对象。

这个想法的一个实现是TypeJSON,我正是为此任务创建的:

@JsonObject
class Foo {
    @JsonMember
    name: string;

    getName(): string { return this.name };
}
var foo = TypedJSON.parse('{"name": "John Doe"}', Foo);

foo instanceof Foo; // true
foo.getName(); // "John Doe"
轩辕庆
2023-03-14

现在可以使用< code>Object.assign(target,...来源)。按照你的例子,你可以这样使用它:

class Foo {
  name: string;
  getName(): string { return this.name };
}

let fooJson: string = '{"name": "John Doe"}';
let foo: Foo = Object.assign(new Foo(), JSON.parse(fooJson));

console.log(foo.getName()); //returns John Doe

Object.assign是ECMAScript 2015的一部分,目前可在大多数现代浏览器中使用。

梁烨
2023-03-14

这个问题相当广泛,所以我将给出几个解决方案。

下面是一个使用Helper方法的示例,您可以根据自己的需要进行更改:

class SerializationHelper {
    static toInstance<T>(obj: T, json: string) : T {
        var jsonObj = JSON.parse(json);

        if (typeof obj["fromJSON"] === "function") {
            obj["fromJSON"](jsonObj);
        }
        else {
            for (var propName in jsonObj) {
                obj[propName] = jsonObj[propName]
            }
        }

        return obj;
    }
}

然后使用它:

var json = '{"name": "John Doe"}',
    foo = SerializationHelper.toInstance(new Foo(), json);

foo.GetName() === "John Doe";

高级反序列化

这还可以通过将您自己的<code>fromJSON

interface IFooSerialized {
    nameSomethingElse: string;
}

class Foo {
  name: string;
  GetName(): string { return this.name }

  toJSON(): IFooSerialized {
      return {
          nameSomethingElse: this.name
      };
  }

  fromJSON(obj: IFooSerialized) {
        this.name = obj.nameSomethingElse;
  }
}

然后使用它:

var foo1 = new Foo();
foo1.name = "John Doe";

var json = JSON.stringify(foo1);

json === '{"nameSomethingElse":"John Doe"}';

var foo2 = SerializationHelper.toInstance(new Foo(), json);

foo2.GetName() === "John Doe";

另一种方法是创建自己的基类:

class Serializable {
    fillFromJSON(json: string) {
        var jsonObj = JSON.parse(json);
        for (var propName in jsonObj) {
            this[propName] = jsonObj[propName]
        }
    }
}

class Foo extends Serializable {
    name: string;
    GetName(): string { return this.name }
}

然后使用它:

var foo = new Foo();
foo.fillFromJSON(json);

使用基类实现自定义反序列化有太多不同的方法,所以我将根据您的需要来决定。

 类似资料:
  • 问题内容: 我正在尝试以JSON格式回显对象的内容。我对PHP完全没有经验,我想知道是否有预定义的函数可以执行此操作(例如json_encode()),还是您必须自己构建字符串?当谷歌搜索“ PHP对象到JSON”时,我只是在寻找垃圾。 我想要JSON返回的内容: {名称:“ $ name var的内容”,代码:1001,信息:执行请求时出错} 问题答案: 你就在那里。看一下与json_encod

  • 它提供类实例信息,但不提供类实例的序列化内容。 我做错了什么?

  • 我有如下的JSON数组: 我还创建了如下用户类: 我的计划是将incomming JSON数组强制转换为User数组。在JSON中,我将角色作为整数。我的课上有管理和驱动布尔字段。这是ngModel中复选框所需要的。

  • 我有一个泛型类型,它将是事件系统中事件的基类。我们希望这些是单例,但它也是泛型的,以便子类可以在事件触发时指定它们在回调中期望的参数的类型。 我拥有的东西看起来像这样: 这里有些东西我认为很奇怪,主要是因为打字稿的语言要求。GetInstance的参数似乎是必要的,因为< code>var x = new TEvent()似乎不被TypeScript允许。空接口有助于加强什么可以被接受为泛型类型。

  • 本文向大家介绍php递归json类实例,包括了php递归json类实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了php递归json类的实现方法。分享给大家供大家参考。 具体实现代码如下: 希望本文所述对大家的PHP程序设计有所帮助。