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()
{"test2": {"num": 0, "str": ""}, "num": 0, "str": ""}
{"test2": {"num": 200, "str": "def"}, "num": 100, "str": "abc"}
初期状態とシリアライズ後の結果出力しました。
正常にシリアライズができ、また出力も問題ないことが確認できるかと思います。
注意点としてはPDOクラスに継承さえる必要があるのと、
変数名とkey名を統一しなければならない点です。
以上です。
きちんと触って思ったことですが
Pythonって面白いですよね