Caché での JSON の使用
はじめに
[Home] [Back] [Next]
InterSystems: The power behind what matters   
Class Reference   
Search:    

Caché と Caché ObjectScript は、JSON (http://json.org/) を統合的にサポートするようになりました。高速でシンプルかつ強力な一連の新機能を使用して、オブジェクトやテーブルと同じくらい簡単に JSON のデータ構造を扱うことができます。

Caché JSON の機能の実用例
ここでは、JSON の新機能の使用例をいくつか紹介します。
実行時のダイナミック・エンティティの作成と操作
実行時にダイナミック・エンティティを作成して、それらのダイナミック・エンティティの任意のスキーマを定義できます。
   set dynObject1 = ##class(%DynamicObject).%New()
   set dynObject1.SomeNumber = 42
   set dynObject1.SomeString = "a string"
   set dynObject1.SomeArray = ##class(%DynamicArray).%New()
   set dynObject1.SomeArray."0" = "an array element"
   set dynObject1.SomeArray."1" = 123
リテラル JSON コンストラクタを使用したダイナミック・エンティティの作成
リテラル JSON 文字列を割り当てることで、ダイナミック・エンティティを作成することもできます。リテラル JSON コンストラクタの {}[] は、%New() コンストラクタの代わりに使用できます。例えば、set x=##class(%DynamicArray).%New() の代わりに set x=[] を使用して動的配列を作成できます。%New() とは異なり、リテラル JSON コンストラクタは、プロパティや要素を指定する JSON リテラル文字列を取ることもできます。したがって、以下の単純な代入文を使用して、上記の例の dynObject1 とまったく同じオブジェクトを作成できます。
   set dynObject2 = {"SomeNumber":42,"SomeString":"a string"}
   set dynObject2.SomeArray = ["an array element",123]
この例では、コンストラクタごとに 1 つの文を使用していますが、配列コンストラクタを同じくらい簡単にオブジェクト・コンストラクタ内で入れ子にすることができます。
dynObject1dynObject2 がまったく同じであることを示すために、これらのオブジェクトを、%ToJSON() メソッドによって返されたシリアル化された JSON 文字列として表示できます。
   write "object 1: "_dynObject1.%ToJSON(),!,"object 2: "_dynObject2.%ToJSON()

object 1: {"SomeNumber":42,"SomeString":"a string","SomeArray":["an array element",123]}
object 2: {"SomeNumber":42,"SomeString":"a string","SomeArray":["an array element",123]}
Caché のダイナミック式を使用した値の定義
リテラル・コンストラクタの {}[] で囲まれたテキストでは、有効な JSON 構文を使用する必要がありますが、1 つだけ例外があります。要素またはプロパティの値として、JSON リテラルの代わりに括弧で囲まれた Caché の式を使用できます。この ObjectScript のダイナミック式 (set 文の右側と同等) は、実行時に評価されて有効な JSON 値に変換されます。次の例のダイナミック式には、Caché の $ZDATE 関数の呼び出しが含まれています。
   set dynObj = { "Date":($ZD($H,3)) }
評価されたダイナミック式の値は、dynObject.Date を取得したときに表示されます。
   write "Value of dynamic expression is: "_dynObject.Date

Value of dynamic expression is: 2016-07-27
(これらのトピックの詳細は、ダイナミック式とドット構文の使用 を参照)。
ダイナミック・エンティティとキャノニック形式の JSON 文字列の間の変換
ダイナミック・エンティティで提供されているシリアル化メソッドを使用すると、それらのダイナミック・エンティティを JSON 文字列に変換したり、その逆方向に変換したりできます。以下の例では、リテラル・コンストラクタを使用してダイナミック・オブジェクトを作成し、オブジェクトの %ToJSON() メソッドを呼び出して、それを myJSONstring にシリアル化します。
   set myJSONstring = {"aNumber":(21*2),"aDate":($ZD($H,3)),"anArray":["string",123]}.%ToJSON()
このシリアル化された JSON オブジェクトは、その他の文字列と同様に格納および取得できます。クラス・メソッド %FromJSON() は、任意のソースから有効な JSON 文字列を取得して、ダイナミック・オブジェクトに変換できます。以下のコードでは、myJSONstring をダイナミック・オブジェクト myObject に非シリアル化し、%ToJSON() を使用して表示します。
   set myObject = ##class(%DynamicAbstractObject).%FromJSON(myJSONstring)
   write myObject.%ToJSON()

{"aNumber":42,"aDate":"2016-08-29","anArray":["string",123]}
(シリアル化の詳細は、ダイナミック・エンティティと JSON の間の変換 を参照してください)。
ダイナミック・エンティティ・メソッドの連鎖
一部のダイナミック・エンティティ・メソッドは連鎖させることができます。この例では、2 つの要素を持つ動的配列を作成してから、%Push() メソッドを連鎖させて、この配列の末尾に 3 つの要素を追加します。最後の連鎖された %ToJSON() の呼び出しによって、シリアル化された文字列が表示されます。
   set dynArray = ["a","b"]
   write dynArray.%Push(12).%Push({"a":1,"b":2}).%Push("final").%ToJSON()

["a","b",12,{"a":1,"b":2},"final"]
(連鎖可能なメソッドの詳細は、メソッドの連鎖 を参照してください)。
反復処理とデータ型の確認
ダイナミック・エンティティ・メソッドは、反復処理やデータ型の確認などの目的用にも提供されています。この例では 2 つの JSON 文字列を作成し、それらのうち 1 つを dynEntity に非シリアル化して (いずれか一方が機能する)、dynEntity の反復子を取得します。
   set arrayStr = [12,"some string",[1,2]].%ToJSON()
   set objectStr = {"a":12,"b":"some string","c":{"x":1,"y":2}}.%ToJSON()
   set dynEntity = {}.%FromJSON(objectStr)
   set itr = dynEntity.%GetIterator()
while ループの反復ごとに、%GetNext() はプロパティ名または配列インデックスを key に返して、メンバ値を val に返します。%GetTypeOf() の返り値は、この値のデータ型を示す文字列です。
   while itr.%GetNext(.key,.val) {write !,key_": "_"/"_val_"/, type: "_dynEntity.%GetTypeOf(key)}

a: /12/, type: number
b: /some string/, type: string
c: /1@%Library.DynamicObject/, type: object
(これらおよび関連するメソッドの詳細は、反復処理とスパース配列 および データ型を使用した作業 を参照)。
ダイナミック・エンティティ・メソッドの概要
ダイナミック・エンティティ・メソッドは、次のカテゴリにグループ分けできます。
作成、読み取り、更新、削除
%Set() は、既存のダイナミック・エンティティ・メンバ (プロパティまたは要素) の値を変更したり、新しいメンバを作成してそのメンバに値を割り当てたりできます。%Remove() は、既存のメンバを削除します。%Get() は、メンバの値を取得します。詳細は、ダイナミック・エンティティの作成と変更 を参照してください。
反復処理とスパース配列
%GetIterator() は、ダイナミック・エンティティの各メンバを指すポインタが含まれた反復子を返します。%GetNext() は、反復子によって指定されたメンバのキーと値を返して、カーソルを次のメンバに進めます。%Size() は、メンバの数を返します (スパース配列内の未割り当て要素を含む)。%IsDefined() は、メンバに値が割り当てられているかどうかを判定します。詳細は、反復処理とスパース配列 を参照してください。
スタック関数
%Push() は、動的配列の末尾に新しい要素を追加します。%Pop() は、配列の最終要素を削除して、その要素の値を返します。これらのメソッドをダイナミック・オブジェクトに対して使用することはできません。オブジェクトのプロパティは予測可能な順序で格納されていないからです。詳細は、動的配列での %Push と %Pop の使用 を参照してください。
JSON のシリアル化と非シリアル化
%FromJSON() は、JSON 文字列をダイナミック・エンティティに変換します。%ToJSON() は、ダイナミック・エンティティをキャノニック形式の JSON 文字列にシリアル化します。詳細は、ダイナミック・エンティティと JSON の間の変換 を参照してください。
データ型の情報
%GetTypeOf() は、指定されたメンバ値のデータ型を示す文字列を返します。%Set()%Push() では、値のデータ型を明示的に指定するためのオプションの 3 つ目の引数が用意されています。詳細は、データ型を使用した作業 を参照してください。
各メソッドの説明と詳細情報へのリンクは、ダイナミック・エンティティ・メソッドのクイック・リファレンス を参照してください。