Edited at

PythonでJsonを簡単にシリアライズできるクラスを作成してみた

More than 3 years have passed since last update.

PythonでJsonを扱う必要があり、組み込みの機能だと

若干扱いにくかったので簡単にPythonでJsonを更に扱いやすくなるような

クラスを作成しました

Pythonをきちんと触ったのは初めてなので若干使い方がおかしかったり、

そもそも既存の機能にあるかもしれません。


目標

PythonでJsonを扱う際に

Python、Json間はMapじゃないとできない。

これだと、クラス化するにはクラスごとに記述しなくてはいけなく、

またクラスからJsonを出力するさいもクラスごとに処理を書かなくてはいけない。

これはとても面倒である

そのため、Jsonのkeyと変数名から自動でシリアライズして

変数名からJson化してくれるようなクラスを作成する


ソースコード

今回のクラスはこんな感じになりました。


JsonAdapter.py

#!/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化しています


使いかた

サンプルコードは以下になります。


sample.py

#!/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って面白いですよね