3

次の JSON オブジェクトを取得したとします。

{ id: 3, name: 'C' }

それがビタミンオブジェクトプログラミング言語オブジェクトかをどうやって見分けることができますか。私の言いたいことが分かりますか?

Type型付き言語では、オブジェクトの性質 (オブジェクトの) をその名前そのものから単純に理解します。各オブジェクトには名前があります。JSON で同様のことを実現するにはどうすればよいでしょうか? JSON オブジェクトに名前を付けるにはどうすればよいでしょうか? 確立されたパターンはありますか?

4

3 に答える 3

4

この問題がある場合は、シリアル化形式が適切に定義されていないことを意味します。いつでも問題なくJSONオブジェクトから逆シリアル化できるはずです。

2つのオプションがあります。

タイプフィールドの追加:同じフィールド名のセットを持つ複数のタイプがあるため、型付きオブジェクトを作成できません。タイプフィールドを追加することにより、オブジェクトの基になるタイプについて疑問がなくなります。このオプションを使用すると、実際のオブジェクトを作成するときにタイプフィールドを処理するプロセスを実行する必要があります。

コンテキストを使用して、オブジェクトのタイプを決定します。送信したクエリが、1つのタイプのオブジェクトのみを返す必要があることを示している場合、問題はありません。または、複数のタイプを返すことができる場合、応答形式でオブジェクトをタイプ別にグループ化する必要があります。

{
  "states": [ { id: 3, name: 'New York' } ],
  "cities": [ { id: 4, name: 'New York' } ]
}
于 2012-05-30T11:10:51.587 に答える
3

オブジェクトのタイプを説明するフィールドを追加する必要があります。そうすれば、タイプについて疑いを持つことは決してありません。たとえば、Google の Calendar APIを見てください。Google のカレンダー リソースにはすべて、タイプを説明する「kind」フィールドがあります。

カレンダー イベントは次のようになります。

{
    "kind": "calendar#event",
    "etag": etag,
    "id": string,
    "created": datetime,
    "updated": datetime,
    "summary": string,
    ...
}

次のようなカレンダー リスト エントリ:

{
    "kind": "calendar#calendarListEntry",
    "etag": etag,
    "id": string,
    "summary": string,
    "description": string,
    "location": string,
    ...
}

于 2012-05-30T11:39:09.423 に答える
1

他の場所から取得した JSON に対してそれを行う方法はありません。

JSON を制御できる場合は、次のようにすることができます。

  1. オブジェクトに「タイプ」フィールドを追加します。

  2. これを処理するように 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 を必要とせず、新しい型に簡単に拡張できるという利点があります (コードの変更は必要ありません)。

于 2012-05-30T10:51:35.097 に答える