12

オブジェクト p1 の JSON 文字列化された結果を解析して別のオブジェクト p2 に戻すと、2 番目のオブジェクトは最初のオブジェクトに関連付けられたデータを取得しますが、そのオブジェクトに対してネットワークを呼び出すことはできません。http://www.typescriptlang.org/Playground/を使用して、次のことを試しました。

class Person
{
    constructor(public name: string, public age: number) {
    }
    Age() { return this.age; }
}

// Create a person
var p: Person = new Person("One", 1);

// Create a second person from the JSON representation
// of the first (NOTE: assert it is of type Person!)
var p2: Person = <Person>JSON.parse(JSON.stringify(p));

document.writeln("Start");

document.writeln(p.name);  // OK: One
document.writeln(p.Age()); // OK: 1

document.writeln(p2.name); // OK: One
document.writeln(p2.age;   // OK: 1
document.writeln(p2.Age()); // ERROR: no method Age() on Object

document.writeln("End");

JSON データを解析して適切な Person オブジェクトを取得するにはどうすればよいですか?

4

2 に答える 2

17

JSON はデータのみの表現であり、動作ではありません。

JSON オブジェクトを受け入れ、そこからデータをハイドレートするオブジェクトにメソッドを作成できますが、JSON オブジェクトは動作 (メソッドなど) をプレーン データのみに転送することはできません。

class Person
{
    constructor(public name: string, public age: number) {
    }

    Age() { return this.age; }

    static fromJson(json: string) {
        var data = JSON.parse(json);
        return new Person(data.name, data.age);
    }
}

var p: Person = new Person("One", 53);
var jsonPerson = JSON.stringify(p);

var p2: Person = Person.fromJson(jsonPerson);

alert(p2.Age().toString());
于 2013-07-03T13:33:26.480 に答える
5

これを試して:

// Create a person
var p: Person  = new Person("One", 1);

// JSON roundtrip
var p_fromjson = JSON.parse(JSON.stringify(p))

// Hydrate it
var p2: Person = Object.create(Person.prototype);
Object.assign(p2, p_fromjson);

document.writeln(p2.Age()); // OK
于 2016-12-21T17:34:33.587 に答える