日記帳だ! with Tux on Libserver

二度目の大改造!! 日記帳…か?を継承し、より柔軟でパワフルなBlogに変身しました。

RSSに対応しています。リンク・コメント・トラックバックは自由にしていただいてほぼ問題ありません。
RSS購読方法、僕のリンク・コメント・トラックバックについての考えを読むことをおすすめします。

JavaScriptを有効にし、Cookieを受け入れ、以下のブラウザを使うことで完全なコンテンツが楽しめます。
Mozilla Firefox 3.0(Get Firefox)・Opera 9.6・Safari 3.2・Lunascape 4/5(Gecko)・Lunascape 5(WebKit)
Internet Explorer 7/8とそれを使うIEコンポーネントブラウザ(Lunascape・Sleipnirなど)

JSONと動的型付けのIronPython

IronPythonは動的型付けをやるのだが、これは実はありがたいことが多い。
返り値がobject型だろうが、実際そのオブジェクトが、何型かというのに注目してくれる。
これはC#では考えられないことで、C#ではいちいちキャストしないといけない。
結構、.NET Frameworkは動的型付けをうまくやってくれるなんてのもIronPythonの成果ですからね。
こういうのは便利に使っていきたいものだ。
ただインタプリタというだけでなく、こういうこともあるんです。
実はこれJson.NETの話なんですけどね。
JSONは非常に扱いやすいので、いろいろ試してみようというわけでダウンロードしてきた。
ところで、IronPythonなのだが、CPythonという標準のPythonの2.4系までの機能が載ってるらしい。
で、JSON関係のライブラリは2.6から追加されたらしく、IronPythonだからというのはなかった。
非常に残念なのだが、C#での勉強と思ってやってみることにした。
それでダウンロードするのだが、.NET Framework 2.0で使いたい人は1.3をダウンロードする。
さて、このJson.NETはシリアライズ・デシリアライズを提供している。
インスタンスをシリアライズするにはNewtonsoft.Json.JavaScriptConvert.SerializeObjectメソッドを、
デシリアライズは、Newtonsoft.Json.JavaScriptConvert.DeserializeObject<T>メソッドを使うといいとおもう。
Newtonsoft.Json.JavaScriptConvert.DeserializeObjectメソッドで、単に文字列を処理したときどうなるか見てた。
すると、数字は整数はInt64(long)、小数はdouble、文字列はstringとか。
JavaScriptの配列はNewtonsoft.Json.JavaScriptObjectArray型、ObjectはNewtonsoft.Json.JavaScriptObject型みたい。
で、実はそれぞれ、System.Collections.Generic.List<object>、System.Collections.Generic.Dictionary<string,object>を継承しています。
まぁなんで、あまり気にせず[]で囲まれてるのはList<object>、{}で囲まれてるのはDictionary<string,object>だと。
# encoding:utf-8
import clr
import System
clr.AddReferenceToFile("Newtonsoft.Json.dll")
import Newtonsoft.Json
def main():
res=Newtonsoft.Json.JavaScriptConvert.DeserializeObject("[1,[2,3,4]]")
print res[0]
for cur in res[1]:
print ">%d"%(cur,)
res=Newtonsoft.Json.JavaScriptConvert.DeserializeObject('{"foo":"bar","hoge":100,"hage":20}')
print res['hoge']*res['hage']
for cur in res:
print "%-5s: %s"%(cur.Key,cur.Value)
if __name__=='__main__':
main()
まぁ、こんな感じ。C#で書くとこうシンプルには行かない。
それで注意しないといけないのは、Dictionary<string,object>をforで回すとき、
  for key,val in res.iteritems():
print "%-5s: %s"%(key,val)
このようなことはできない。
まぁあくまでもPythonの辞書型と.NET FrameworkのDictionaryクラスは違うと言うことです。
DictionaryクラスはKeyValuePairを1つづつ取り出して回すものなので、その辺注意。
逆にシリアライズするときだけど、まぁこちらはそんなに気にしなくていいような。
def main():
print Newtonsoft.Json.JavaScriptConvert.SerializeObject( [1,2,3] )
print Newtonsoft.Json.JavaScriptConvert.SerializeObject( (4,5,6) )
obj=System.Collections.Generic.Dictionary[str,object]( {'John':100,'Tom':200} )
print Newtonsoft.Json.JavaScriptConvert.SerializeObject( obj )
まぁ見りゃわかるね、という感じですが。
ただこれも、Pythonの辞書型じゃなくて、.NETのDictionaryクラスを使う必要がある。
一方、Pythonのリスト・タプルはそのまま使える。
どうもこっちはIEnumerableならOKみたいです。
IronPythonでいろいろやってきましたが、
C#では型の加減があるので、List<object>、Dictionary<string,object>でいじるのではなく、
自作クラスをシリアライズ・デシリアライズするのがよさそう。
      vector v=new vector(2,3);
string json=Newtonsoft.Json.JavaScriptConvert.SerializeObject(v);
Console.WriteLine(json);
v=Newtonsoft.Json.JavaScriptConvert.DeserializeObject<vector>("{\"x\":10,\"y\":20}");
Console.WriteLine(v);
まぁこんな感じです。
JSONはファイルに書き出すというよりかは、ネットワークで送るのがおおいかなと。
XMLのシリアライズも標準で使えますしね。
まぁその辺は好きにどうぞ。
Author : hidemaro
Date : 2008/10/16(Thu) 23:51
Windows・Microsoft | Comment | trackback (0)

Tools