アプリ担当の木村です。今回は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って面白いですよね

お見積いたします。どんなことでも、お気軽にご相談ください。

お客様のご要望とご予算に応じて最適なソリューションをご提案いたします。
VRの開発やアプリ開発以外でも、ぜひ一度ご相談ください。