アプリ担当の木村です。今回はPythonのお話です。
PythonでJsonを扱う必要があり、組み込みの機能だと
若干扱いにくかったので簡単にPythonでJsonを更に扱いやすくなるような
クラスを作成しました
Pythonをきちんと触ったのは初めてなので若干使い方がおかしかったり、
そもそも既存の機能にあるかもしれません。
目標
PythonでJsonを扱う際に
Python、Json間はMapじゃないとできない。
これだと、クラス化するにはクラスごとに記述しなくてはいけなく、
またクラスからJsonを出力するさいもクラスごとに処理を書かなくてはいけない。
これは**とても面倒**である
そのため、Jsonのkeyと変数名から自動でシリアライズして
変数名からJson化してくれるようなクラスを作成する
ソースコード
今回のクラスはこんな感じになりました。
#!/usr/bin/env python # -*- coding: utf-8 -*- import sys import json class JsonAdapter(object): # jsonからシリアライズ def Serialize(self, argJsonData) : jsonData = argJsonData if isinstance(argJsonData, basestring ) : jsonData = json.loads(argJsonData) for key in self.__dict__.keys(): if isinstance(getattr(self,key), JsonAdapter ) or getattr(self,key) == None : valclass = getattr(self,key) if valclass == None : valclass = getattr(sys.modules["Classes.DataPDO"],key)() valclass.Serialize(jsonData[key]) setattr(self,key, valclass) elif isinstance(getattr(self,key), int ) : setattr(self,key, int(jsonData[key])) else : setattr(self,key, jsonData[key]) # Jsonを出力 def ToJson(self): jsonDict = self.__ToDictionary() jsonstring = json.dumps(jsonDict, ensure_ascii=False) return jsonstring #Mapを作成 def __ToDictionary(self): jsonDict = {} for key in self.__dict__.keys(): if isinstance(getattr(self,key), JsonAdapter ) : jsonDict.update({key : getattr(self,key).__ToDictionary()}) else : jsonDict.update({key : getattr(self,key)}) return jsonDict
軽く解説をすると
def Serialize(self, argJsonData) :
では、jsonから一旦Dictionaryを作成し、
変数名をkeyとして値を取っています。
またクラスの場合はクラスを生成して、再度シリアライズしています。
`ToJson(self):`
では逆に変数名をkeyとしたDictionaryを作成し、
Json化しています
使いかた
サンプルコードは以下になります。
#!/usr/bin/env python # -*- coding: utf-8 -*- import JsonAdapter class Test(JsonAdapter.JsonAdapter): def __init__(self): self.num = 0 self.str = "" self.test2 = Test2() class Test2(JsonAdapter.JsonAdapter): def __init__(self): self.num = 0 self.str = "" if __name__ == "__main__": json = """{"test2": {"num": 200, "str": "def"}, "num": 100, "str": "abc"}""" test = Test() # 初期状態 print test.ToJson() test.Serialize(json) #シリアライズした後 print test.ToJson()
Python{"test2": {"num": 0, "str": ""}, "num": 0, "str": ""} {"test2": {"num": 200, "str": "def"}, "num": 100, "str": "abc"}
初期状態とシリアライズ後の結果出力しました。
正常にシリアライズができ、また出力も問題ないことが確認できるかと思います。
注意点としてはPDOクラスに継承さえる必要があるのと、
変数名とkey名を統一しなければならない点です。
以上です。
きちんと触って思ったことですが
Pythonって面白いですよね