木曜日, 9月 03, 2009

【Google App Engine】 datastore.Entityにおけるプロパティ変換について このエントリーを含むはてなブックマーク


Reflex ore 1.2.2におけるJSON変換

 今回はまず、Reflex Core 1.2.2の紹介からしたい。このバージョンから、JSONにおいてもハイフン、コロン、属性、テキストノードの表現ができるようになった。
 もともとJSONはプロパティ名と値がペアになったシンプルな構造表現しかできないが、XMLからJSONに変換する際には、名前空間や属性、テキストノードといったものをムリクリ表現しなければならない。先日、ココでお伝えしたとおり、実は1.2.1でも属性表現ができるようになっていたのだが、これには一部不具合があったので修正したのと、名前空間やテキストノードなどにも対応したので、1.2.2として公開させていただくことにした。

1. SONでは、要素名の"-"が"__"に変換されるため"type_str-ing"は、"type_str__ing"となります。
2. XMLの名前空間で用いる”:”は、JSONでは"___"に変換されるため、"xml:atom"は、"xml___atom"となります。
3. XMLの属性は、JSONでは"要素名____属性名"プロパティとなるため、"attr1"は、JSONでは"type_str__ing____attr1"プロパティとして表現されます。
4. XMLのテキストノードは、JSONでは、"_______text"プロパティに変換されます。


datastore.Entityのプロパティ変換について

 次にGAEのdatastore.Entityのプロパティ変換の話。
 GAEには、低レベルAPIが用意されているが、これを使うと検索結果はdatastore.Entityクラスのなかのプロパティと値という形で格納される。このままでは不便なので、JDOのようにJavaオブジェクトに変換する必要があるが、GAEのAPIでは変換APIが用意されていないので、私たちは自作のものを利用している次第である。(ReflexGaeのなかのEntityConverter)
 ところが、datastore.Entityのプロパティ変換は以下のような癖があるため、注意しなければならない。Javaオブジェクトとプロパティ変換という意味ではReflexと同じように一筋縄ではいかないようで、ここでもムリクリやっているのがよくわかる。

 1)元のクラスの項目名(JavaのField名)に"$"があると、datastore.Entityのプロパティでは"24"に変換される。
 2)元のクラスの項目名の先頭に"_"があると、datastore.Entityのプロパティでは""に変換される。項目の間の"_"はそのまま。
   o 例)modelの項目名「_$xml$lang」は、datastore.Entityのプロパティ名が「24xml24lang」となる。
    + -> "$"と先頭の"_"について、プロパティ名を変換して読む必要がある。
 3)プロパティ名が重複すると、名前の末尾に「"_"+番号」が付加される。
   o アルファベットの昇順で、番号なし、"_0"、"_1"、・・・という順番のようである。
   o 例)modelクラスに「test」「_test」「__test」という3個の項目があると、Entityクラスのプロパティ名は順に「test_1」「test_0」「test」となる。
     (abc...よりも、"_"の方が先)


 1)および2)に対応したEntityConverterは、ReflexGae 0.9.6に含めているが、3)については未だ対応していないのでご注意願いたい。これは今のところ、modelの項目名に、「test」「_test」のように、頭にアンダースコアがあり、かつ、同じ名前をつけないようなルールで対応するしかない。 

ReflexGae 0.9.6

 * KeyUtils : 親キーのnameを指定できるようにした
 * EntityConverter : Entityのプロパティ名を指定する時、"$"を"24"に、先頭の"_"を""に変換するよう修正


0 件のコメント:

 
© 2006-2015 Virtual Technology
当サイトではGoogle Analyticsを使ってウェブサイトのトラフィック情報を収集しています。詳しくは、プライバシーポリシーを参照してください。