他の場所から取得した JSON に対してそれを行う方法はありません。
JSON を制御できる場合は、次のようにすることができます。
各オブジェクトに「タイプ」フィールドを追加します。
これを処理するように JSON 関数を作成します。これには、安全な方法と安全でない方法の 2 つの方法があります。
安全な方法
関数を作成しますstringifyJSONType()
。これは通常どおり文字列化しますが、オンザフライで型パラメーターを追加します。
function stringifyJSONType(o){
o.type=o.constructor.name;
var s=JSON.stringify(o);
delete o.type; //To be clean and not modify the object.
return s;
}
ここで、「安全な」方法では、解析が必要なすべての型に対して switch-case を作成する必要があります。これは、特定のタイプ (switch-case に保持されているもの) のみを許可します。
function parseJSONType(s){
var o=JSON.parse(s);
switch(o.type){
case "String":
o.__proto__=String;
break;
case "Date":
o.__proto__=Date;
break;
case "City": //Your custom object
o.__proto__=City;
break;
case "State": //Your custom object
o.__proto__=State;
break;
case "Country": //Your custom object
o.__proto__=Country;
break;
/*.... more stuff... */
case "Object":
default:
o.__proto__=Object;
break;
}
delete o.type;
return o;
}
さて、これら 2 つのメソッドを と のように使用するJSON.parse()
とJSON.stringify()
、機能します。ただし、サポートしたい新しいタイプごとに、余分な を追加する必要がありますcase
。
安全でない方法
eval()
悪質な方法を使用しているだけで、それほど安全ではありません。これはあまり良くありません。. type
ただし、JSON にカスタム パラメーターを追加できる人が他にいない限り、問題はありません。
ここでは、stringifyJSONType()
上記と同じものを使用しますが、別の解析方法を使用します。
function stringifyJSONType(o){
o.type=o.constructor.name;
var s=JSON.stringify(o);
delete o.type; //To be clean and not modify the object.
return s;
}
function parseJSONType(s){
var o=JSON.parse(s);
o.__proto__=eval(o.type);
delete o.type;
return o;
}
これには、switch-case を必要とせず、新しい型に簡単に拡張できるという利点があります (コードの変更は必要ありません)。