LoginSignup
7
10

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-12-15

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

7
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
10