バージョン2016.1 のJSON前方互換コード記述方法
背景
バージョン 2016.1 は非常に強力なJSON機能を新しく導入しました。しかしながら、このバージョンのJSONシンタックスはバージョン2016.2で変更されます。これはCaché ObjectScript シンタックスとの整合性を保つためです。この変更により、バージョン2016.1で動作するコードは前方互換性がなくなります。
将来リリースされるバージョンで動作しなくなるコードを最小化するため、以下の推奨事項およびツールをご案内します。これらは実際に弊社内でバージョン2016.1のJSONアプリケーションに対して実施しているものです。
弊社ではこのような情報はお客様にとっても有益であると考え、この文書でご案内しています。これらの推奨事項に従い、以下にリンクされているマクロを適用することで、バージョン2016.1から2016.2へのアップグレードでJSONコードに対する変更の必要がなくなります。
( ) を使用する
バージョン 2016.1 では、JSONとCaché ObjectScript を混在させた場合、( ) の要・不要に一貫性がありませんでした。このため、今後のバージョンではJSONオブジェクト内の値にCaché ObjectScript の式を使用する場合は ( ) の使用が必須になります。
推奨:JSONの一部としてCaché ObjectScriptを使用する場合は、常にCaché ObjectScript部分を ( ) で囲んでください。言い換えると、JSON形式として不適切なものはすべて ( ) で囲みます。これはCaché ObjectScriptの変数名にも当てはまります。
例えば、次のようにします:
バージョン2016.1では、JSONリテラル文字列 ( http://www.json.org/ で定義されている “string” や “value” など)はCaché ObjectScript のシンタックスでエスケープされていました。例えば、文字列中の ” は “” でエスケープします。これは、オブジェクト初期化において、すべての妥当なJSONが妥当ではない事を意味します。これを改善するためリテラル文字列のエスケープはCaché ObjectScript のエスケープではなくJSONのルールに従うように変更されます。JSON値で ( ) で囲まれたものはいずれのバージョンでも同じように動作します。括弧は「この部分がJSONではなく Caché ObjectScript である」ことを示します。これは制御文字、二重引用符、バックスラッシュを含むリテラル値に適用されます。
推奨:JSONオブジェクト内でエスケープする必要があるすべてのリテラル値は括弧で囲って Caché ObjectScript のエスケープ(二重引用符2つ)を使用する文字列として定義します。例えば次のようにします。
システムメソッドの使用
バージョン2016.1 で記述されたJSONコードで、将来の変更により最も影響を受けるのは、標準Caché ObjectScript 名前規約に沿った新しいシステムメソッド・シンタックス (例 $methodname())です。今回の変更により、すべての .$foobar() メソッドは将来のバージョンでは .%Foobar() メソッドに置き換わります(注意: $ から % に変わり、最初の文字を大文字に変更)。この新しいメソッドはバージョン 2016.1 では使用できないため、バージョン 2106.1 で記述する「将来動作する」アプリケーションは、現在のシステムメソッドをすべてマクロにカプセル化し、そのマクロが将来のバージョンで新しいシンタックスを使用するようにします。
*サンプル* のマクロ群をこちら(英語サイト)で入手できます。
Gist:
https://gist.github.com/bspead/bf23a28029e8d389ac39a3a4af3342bd
重要な免責事項: これらのマクロはサンプルとして提供するものであり、インターシステムズが動作を保証するものではありません(このため、これらマクロは製品に含まれることはありません)。また、アプリケーションのすべてのインスタンスがバージョン2016.2にアップグレード完了後にマクロを削除する必要があります – これらのマクロはアプリケーションのコードベースに永続的に含めるべきではありません。
推奨事項: この Gist コードサンプル(英語サイト) を使用して、アプリケーションのシステムメソッドをカプセル化します。
推奨事項: バージョン2016.1でシステムメソッド(.$foobar() 等)を使用するすべてのアプリケーションは、システムメソッドを直接使用する代わりに cosJSON.inc に含まれるマクロを使用します。例えば、
%Object と %Array クラスの使用
%Object と %Array クラスの名前は将来のバージョンでは %DynamicObject と %DynamicArray に変更されます。このため、%Object および %Array クラスを直接呼び出すことは避けてください。これらのクラスのほとんどは内部使用で直接使用するべきではありません。しかし、使用してもいいいくつかの場合があります。特に空文字列または文字列から新しいダイナミック・オブジェクトまたはダイナミック・アレイを作成する場合です。クラス名を直接使用する代わりに、インライン式を使用できます。
推奨事項: 新しいオブジェクトの作成に %New() を使用せず、インラインで作成します。例えば、
推奨事項: クラスメソッドにアクセスするための新しいダイナミック・オブジェクトのインスタンス化する場合はインライン式を使用します。例えば、
推奨事項: スタジオアシストでJSON変数を認識させるため #Dim を使用している場合は、そのまま %Object および %Array を使用しても問題ありません。バージョン2016.2へのアップグレードでこれが問題になることはありません。ただし、バージョン2016.1よりも後のバージョンではこれらのクラスは認識されなくなるため、スタジオアシストでこれら変数を認識させるには #Dim で使用しているクラス名を %DynamicObject と %DynamicArray に変更する必要があります。