DTPab

DTPにまつわるあれこれ

withPropertiesとJSON

はじめに

先日終了したInDesign JavaScript教室(以下、IDJS教室)の参加者の方と、オブジェクトモデルビューアにある「withProperties」という引数の渡し方がわかりにくいですね、という話をしました。
trueやfalseといった真偽値や、SaveOptions.YESみたいな列挙値でもない、ブレース({})の中をコロン(:)とカンマ(,)で区切ったちょっと変わった書き方で引数を指定します。
これは「Object型オブジェクト」というオブジェクトです*1。ご存知ない方には「何回オブジェクトって言うんだコイツ」と思われるかもしれませんが、本当にそうとしか呼べないものなのです^^;;
これを深く掘り下げるとJavaScriptの仕様にまでたどり着く長く険しい旅路になるので、細かい話は割愛します。今回は

  • withPropertiesに渡す引数の書き方
  • オブジェクトリテラルJSON

という2つに絞って説明します。必要となる用語については併記しますが、それ以上の細かい説明はしませんので、知りたい方はMDNや開眼本などを適宜ご参照いただき、理解してもらえたら嬉しいです。

withPropertiesに渡す引数の書き方

百聞は一見に如かずということで、まずは実例をご覧ください。

var actDoc = app.documents.add();
var rec = actDoc.rectangles.add({
    geometricBounds: [10, 10, 40, 40],
    fillColor: actDoc.swatches.item("Black")
});

このRectangles.addメソッドの引数{…}の部分がObject型オブジェクトです。
書き方のルールは、

  • { }で囲む
  • プロパティ名 : セットする値 を1セットにして{ }の中に記述する
  • プロパティ名 : セットする値 を複数記述する場合は,で区切る
  • 最後の要素の末尾には,を入れない

というのが基本的なObject型オブジェクトの記述の仕方です。この{…}で囲った部分がひとつのオブジェクトとして認識されます。
最後の,を入れないのは、同じく,で要素を区切る配列と同じようなことです。{A:X, B:Y, C:Z}というふうに記述しているので、プロパティ名と値を1セットとして考えると分かりやすいと思います。

この例ではメソッドの引数として直接メソッドの( )の中に記述しましたが、一旦変数に入れておいて、その変数を指定するというやり方でもできます。先程の例を書き換えると、

var actDoc = app.documents.add();
var recAttr = {
    geometricBounds: [10, 10, 40, 40],
    fillColor: actDoc.swatches.item("Black")
}; //ここのセミコロン忘れがち?
var rec = actDoc.rectangles.add(recAttr);

という感じになります。常に変数にしてから参照する必要はありませんが、変数にしておくとあとあと便利なケースというのが多々あります。

このような、コロン:で区切ったプロパティと値の1セットproperty : valueをカンマ,で列挙してブレース{ }で囲むというオブジェクトの書き方を、オブジェクトリテラル(もしくはリテラルオブジェクト)といいます*2

オブジェクトリテラルJSON

ちょっと話が飛びますが、このオブジェクトリテラルJSON*3とよく似ています。
オブジェクトリテラルproperty : valueのpropertyの部分は、変数の命名規則と同じで、数字で始まるものやハイフン-で始まるものでなければ、そのまま記述することができます*4
数字やハイフンで始まる場合は(普通そのようなプロパティ名を付けませんが)文字列として記述することで、プロパティ名として指定できます。

var obj = {
    hoge: "そのまま書ける",
    a123: "これもそのまま書ける",
    "123a": "このプロパティ名はそのまま書けないので文字列として記述する",
    '-b': "これも同様"
};

JSONでは、プロパティ名をダブルクォーテーション""で囲んで定義します。シングルクォーテーション''ではなく、ダブルクォーテーションで書くのが正しい書き方です。
オブジェクトの表記法としてはクォーテーション(ダブルでもシングルでも)を付けても付けなくても間違いではありません。ですが、JSONとしてはプロパティ名をダブルクォーテーションで記述する"property" : valueという形が正しい表記になります*5

まとめ

オブジェクトの表記法(オブジェクトリテラル)のうち、厳密な仕様に沿った表記法をJSONと呼ぶ、ということです。

以上、とても簡単にではありますが、引数としてのwithPropertiesの書き方と、オブジェクトリテラルJSONについて説明してみました。かなり簡単に書いたので誤解を招くような書き方があるかもしれませんが、そういうところがあればぜひご指摘ください。

おまけ

ExtendScriptではJSONの読み書きが直接行えません(ES5から組み込まれるため)。なので、ExtendScriptJSONを扱いたい場合は、こちらの記事をご参照ください。

uske-s.hatenablog.com

*1:Object型について、もう少し厳密にいうと「Objectコンストラクタでインスタンス化されたオブジェクト」のことです。より詳しくは「Objectコンストラクタ」、「コンストラクタ(関数)」等について参照のこと。

*2:詳しくは「リテラル」、「オブジェクト初期化子」等について参照のこと。

*3:JavaScript Object Notation:JavaScriptオブジェクト記法の略記。詳細は他所へ譲ります。

*4:より詳しくは、JavaScriptの変数の命名規則について参照のこと。

*5:JSONには他にも細かい仕様がありますが、それはほかに譲ります。